from typing import List, Dict

from titles.wacca.handlers.base import BaseRequest, BaseResponse
from titles.wacca.handlers.helpers import PurchaseType, GenericItemRecv
from titles.wacca.handlers.helpers import TicketItem, SongRatingUpdate, BingoDetail
from titles.wacca.handlers.helpers import BingoPageStatus, GateTutorialFlag


# ---user/goods/purchase---
class UserGoodsPurchaseRequest(BaseRequest):
    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.profileId = int(self.params[0])
        self.purchaseId = int(self.params[1])
        self.purchaseCount = int(self.params[2])
        self.purchaseType = PurchaseType(self.params[3])
        self.cost = int(self.params[4])
        self.itemObtained: GenericItemRecv = GenericItemRecv(
            self.params[5][0], self.params[5][1], self.params[5][2]
        )


class UserGoodsPurchaseResponse(BaseResponse):
    def __init__(self, wp: int = 0, tickets: List = []) -> None:
        super().__init__()
        self.currentWp = wp
        self.tickets: List[TicketItem] = []

        for ticket in tickets:
            self.tickets.append(TicketItem(ticket[0], ticket[1], ticket[2]))

    def make(self) -> Dict:
        tix = []
        for ticket in self.tickets:
            tix.append(ticket.make())

        self.params = [self.currentWp, tix]

        return super().make()


# ---user/sugaroku/update---
class UserSugarokuUpdateRequestV1(BaseRequest):
    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.profileId = int(self.params[0])
        self.gateId = int(self.params[1])
        self.page = int(self.params[2])
        self.progress = int(self.params[3])
        self.loops = int(self.params[4])
        self.boostsUsed = self.params[5]
        self.totalPts = int(self.params[7])
        self.itemsObtainted: List[GenericItemRecv] = []

        for item in self.params[6]:
            self.itemsObtainted.append(GenericItemRecv(item[0], item[1], item[2]))


class UserSugarokuUpdateRequestV2(UserSugarokuUpdateRequestV1):
    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.mission_flag = int(self.params[8])


# ---user/rating/update---
class UserRatingUpdateRequest(BaseRequest):
    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.profileId = self.params[0]
        self.totalRating = self.params[1]
        self.songs: List[SongRatingUpdate] = []

        for x in self.params[2]:
            self.songs.append(SongRatingUpdate(x[0], x[1], x[2]))


# ---user/mission/update---
class UserMissionUpdateRequest(BaseRequest):
    def __init__(self, data: Dict) -> None:
        super().__init__(data)
        self.profileId = self.params[0]
        self.bingoDetail = BingoDetail(self.params[1][0])
        self.itemsObtained: List[GenericItemRecv] = []
        self.gateTutorialFlags: List[GateTutorialFlag] = []

        for x in self.params[1][1]:
            self.bingoDetail.pageStatus.append(BingoPageStatus(x[0], x[1], x[2]))

        for x in self.params[2]:
            self.itemsObtained.append(GenericItemRecv(x[0], x[1], x[2]))

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