"""
FreeExile 2D Spatial Grid Slot & Dimensions Models.
Defines equipment bounding boxes (W x H) and spatial placement coordinates for Inventory & Stash.
"""

from typing import Optional, Dict
from dataclasses import dataclass
from .inventory_types import ItemType


@dataclass(slots=True, frozen=True)
class ItemDimensions:
    width: int
    height: int

    @property
    def cell_count(self) -> int:
        return self.width * self.height


@dataclass(slots=True)
class GridPlacement:
    x: int
    y: int
    width: int
    height: int


# Canonical equipment dimension mappings based on classic hardcore ARPG rules (PoE2 / Diablo 2)
DEFAULT_TYPE_DIMENSIONS: Dict[ItemType, ItemDimensions] = {
    ItemType.WEAPON: ItemDimensions(2, 4),      # Default 2-handed weapons
    ItemType.ARMOR: ItemDimensions(2, 3),       # Default body armor
    ItemType.CURRENCY: ItemDimensions(1, 1),    # Primal Bloodstones & Orbs
    ItemType.CONSUMABLE: ItemDimensions(1, 2),  # Elixirs, Flasks & Scrolls
    ItemType.RELIC: ItemDimensions(1, 1),       # Amulets, Rings, Bone Charms
    ItemType.GEM: ItemDimensions(1, 1),         # Martial mutator gems
}

SUBTYPE_DIMENSIONS: Dict[str, ItemDimensions] = {
    "WEAPON_2H": ItemDimensions(2, 4),
    "WEAPON_1H": ItemDimensions(1, 3),
    "DAGGER": ItemDimensions(1, 2),
    "SHIELD": ItemDimensions(2, 2),
    "BODY_ARMOR": ItemDimensions(2, 3),
    "HELMET": ItemDimensions(2, 2),
    "GLOVES": ItemDimensions(2, 2),
    "BOOTS": ItemDimensions(2, 2),
    "BELT": ItemDimensions(2, 1),
    "RING": ItemDimensions(1, 1),
    "AMULET": ItemDimensions(1, 1),
    "FLASK": ItemDimensions(1, 2),
    "SCROLL": ItemDimensions(1, 1),
}


def get_default_item_dimensions(
    item_id: str,
    item_type: ItemType,
    subtype: Optional[str] = None
) -> ItemDimensions:
    """Computes exact width and height for any item in inventory grid."""
    if subtype and subtype in SUBTYPE_DIMENSIONS:
        return SUBTYPE_DIMENSIONS[subtype]

    # Specific known 2H Divine Weapons
    weapons_2h = {
        "wpn_abyssal_chainguard_sword",
        "wpn_dragonbone_maw_greataxe",
        "wpn_spinal_recurve_greatbow",
        "wpn_runic_skullspear_halberd",
        "wpn_etheric_demonstaff",
    }
    if item_id in weapons_2h:
        return ItemDimensions(2, 4)

    # 1H Daggers / Short Weapons
    if "dagger" in item_id or "twin_fang" in item_id:
        return ItemDimensions(1, 2)

    # Helmets / Gloves / Boots
    if "helm" in item_id or "mask" in item_id:
        return ItemDimensions(2, 2)
    if "glove" in item_id or "hand" in item_id:
        return ItemDimensions(2, 2)
    if "boot" in item_id or "hai" in item_id or "shoe" in item_id:
        return ItemDimensions(2, 2)
    if "belt" in item_id or "dai" in item_id:
        return ItemDimensions(2, 1)

    return DEFAULT_TYPE_DIMENSIONS.get(item_type, ItemDimensions(1, 1))
