from typing import List, Dict

from titles.wacca.handlers.base import BaseRequest, BaseResponse
from titles.wacca.handlers.helpers import UserOption, DateUpdate


# ---user/info/update---
class UserInfoUpdateRequest(BaseRequest):
    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.profileId = int(self.params[0])
        self.optsUpdated: List[UserOption] = []
        self.unknown2: List = self.params[2]
        self.datesUpdated: List[DateUpdate] = []
        self.favoritesRemoved: List[int] = self.params[4]
        self.favoritesAdded: List[int] = self.params[5]

        for x in self.params[1]:
            self.optsUpdated.append(UserOption(x[0], x[1]))

        for x in self.params[3]:
            self.datesUpdated.append(DateUpdate(x[0], x[1]))


# ---user/info/getMyroom--- TODO: Understand this better
class UserInfogetMyroomRequest(BaseRequest):
    game_id = 0

    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.game_id = int(self.params[0])


class UserInfogetMyroomResponseV1(BaseResponse):
    def __init__(self) -> None:
        super().__init__()
        self.titleViewBadge = 0
        self.iconViewBadge = 0
        self.trophyViewBadge = 0
        self.noteColorViewBadge = 0
        self.noteSoundViewBadge = 0
        self.userViewingInfo = []

    def make(self) -> Dict:
        self.params = [
            self.titleViewBadge,
            self.iconViewBadge,
            self.trophyViewBadge,
            self.noteColorViewBadge,
            self.noteSoundViewBadge,
            self.userViewingInfo,
        ]

        return super().make()


class UserInfogetMyroomResponseV2(UserInfogetMyroomResponseV1):
    def __init__(self) -> None:
        super().__init__()

    def make(self) -> Dict:
        super().make()
        self.params += [0, 0, 0]
        return super(UserInfogetMyroomResponseV1, self).make()


# ---user/info/getRanking---
class UserInfogetRankingRequest(BaseRequest):
    game_id = 0

    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.game_id = int(self.params[0])


class UserInfogetRankingResponse(BaseResponse):
    def __init__(self) -> None:
        super().__init__()
        self.total_score_rank = 0
        self.high_score_by_song_rank = 0
        self.cumulative_score_rank = 0
        self.state_up_score_rank = 0
        self.other_score_ranking = 0
        self.wacca_points_ranking = 0

    def make(self) -> Dict:
        self.params = [
            self.total_score_rank,
            self.high_score_by_song_rank,
            self.cumulative_score_rank,
            self.state_up_score_rank,
            self.other_score_ranking,
            self.wacca_points_ranking,
        ]

        return super().make()
