from typing import Any, List, Dict
from datetime import datetime, timedelta
import json

from core.config import CoreConfig
from titles.wacca.handlers import Dict
from titles.wacca.lily import WaccaLily
from titles.wacca.config import WaccaConfig
from titles.wacca.const import WaccaConstants
from titles.wacca.handlers import *

from core.const import AllnetCountryCode


class WaccaLilyR(WaccaLily):
    def __init__(self, cfg: CoreConfig, game_cfg: WaccaConfig) -> None:
        super().__init__(cfg, game_cfg)
        self.version = WaccaConstants.VER_WACCA_LILY_R
        self.season = 2

        self.OPTIONS_DEFAULTS["set_nav_id"] = 210002
        self.allowed_stages = [
            (2514, 14),
            (2513, 13),
            (2512, 12),
            (2511, 11),
            (2510, 10),
            (2509, 9),
            (2508, 8),
            (2507, 7),
            (2506, 6),
            (2505, 5),
            (2504, 4),
            (2503, 3),
            (2501, 2),
            (2501, 1),
            (210001, 0),
            (210002, 0),
            (210003, 0),
        ]

    async def handle_housing_start_request(self, data: Dict) -> Dict:
        req = HousingStartRequestV2(data)
        allnet_region_id = None
        
        machine = await self.data.arcade.get_machine(req.chipId)
        if machine is not None:
            arcade = await self.data.arcade.get_arcade(machine["arcade"])
            allnet_region_id = arcade["region_id"]

        if req.appVersion.country == AllnetCountryCode.JAPAN.value:
            if allnet_region_id is not None:
                region = WaccaConstants.allnet_region_id_to_wacca_region(
                    allnet_region_id
                )

                if region is None:
                    region_id = self.region_id
                else:
                    region_id = region

            else:
                region_id = self.region_id

        elif req.appVersion.country in WaccaConstants.VALID_COUNTRIES:
            region_id = WaccaConstants.Region[req.appVersion.country]

        else:
            region_id = WaccaConstants.Region.NONE

        resp = HousingStartResponseV1(region_id)
        return resp.make()

    async def handle_user_status_create_request(self, data: Dict) -> Dict:
        req = UserStatusCreateRequest(data)
        resp = await super().handle_user_status_create_request(data)

        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210054
        )  # Added lily r
        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210055
        )  # Added lily r
        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210056
        )  # Added lily r
        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210057
        )  # Added lily r
        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210058
        )  # Added lily r
        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210059
        )  # Added lily r
        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210060
        )  # Added lily r
        await self.data.item.put_item(
            req.aimeId, WaccaConstants.ITEM_TYPES["navigator"], 210061
        )  # Added lily r

        return resp

    async def handle_user_status_logout_request(self, data: Dict) -> Dict:
        return BaseResponse().make()
