"""AutoPOE2 - Stash & Inventory Constants and Configuration (Doc 63 / SSoT 2026).

Định nghĩa hằng số hình học, tọa độ chuẩn hóa tham chiếu 1080p,
các phân loại Stash Tabs và quy tắc điều khiển tương tác.
"""

from __future__ import annotations

from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Optional, Tuple


class StashTabType(str, Enum):
    """Phân loại ngăn hòm đồ (Stash Tab) trong Path of Exile 2."""
    CURRENCY = "CURRENCY"        # Tiền tệ (Orbs, Shards, Runes, Soul Cores)
    WAYSTONES = "WAYSTONES"      # Bản đồ Waystones (Tier 1-16) & Precursor Tablets
    GEMS = "GEMS"                # Uncut Skill / Support / Spirit Gems
    FRAGMENTS = "FRAGMENTS"      # Mảnh ghép chìa khóa, Pinnacle fragments
    DUMP = "DUMP"                # Ngăn gom đồ nhặt về chờ lọc (Dump / Quad)
    CARDS = "CARDS"              # Thẻ bài bói toán (Divination Cards)
    FLASKS = "FLASKS"            # Bình dược liệu (Life, Mana, Charms)
    EQUIPMENT = "EQUIPMENT"      # Trang bị vũ khí, giáp, trang sức
    GENERAL = "GENERAL"          # Ngăn thường không chuyên dụng
    UNKNOWN = "UNKNOWN"          # Chưa phân loại được


class StashAction(str, Enum):
    """Hành động xử lý vật phẩm giữa Inventory và Stash."""
    DEPOSIT = "DEPOSIT"          # Cất vào hòm (Ctrl + Click từ túi)
    WITHDRAW = "WITHDRAW"        # Rút từ hòm ra túi (Ctrl + Click từ hòm)
    KEEP = "KEEP"                # Giữ nguyên trong túi (bảo lưu)
    IGNORE = "IGNORE"            # Bỏ qua không xử lý


@dataclass(frozen=True)
class InventoryGridConfig:
    """Cấu hình lưới túi đồ nhân vật (tham chiếu 1920x1080)."""
    origin_x: float = 1272.0
    origin_y: float = 590.0
    cell_w: float = 52.5
    cell_h: float = 52.5
    cols: int = 12
    rows: int = 5


@dataclass(frozen=True)
class StashGridConfig:
    """Cấu hình lưới hòm đồ thường (tham chiếu 1920x1080)."""
    origin_x: float = 180.0
    origin_y: float = 190.0
    cell_w: float = 52.0
    cell_h: float = 52.0
    cols: int = 12
    rows: int = 12


@dataclass
class StashConfig:
    """Cấu hình hành vi tự động cất/lấy đồ của bot."""
    # Số lượng Waystone tối thiểu giữ lại trong túi để tiếp tục chạy map (người dùng chỉ định: 5)
    keep_waystones_count: int = 5

    # Tùy chọn cất các loại vật phẩm
    deposit_currency: bool = True
    deposit_gems: bool = True
    deposit_gear: bool = True
    deposit_fragments: bool = True

    # Bật tính năng Stash Affinity sẵn có trong POE2
    # Người dùng đã bật trong game: Ctrl+Click lập tức game tự định tuyến về đúng tab chuyên dụng
    use_stash_affinity: bool = True

    # Độ trễ và jitter mô phỏng con người (INV-STASH-CTRL-CLICK: 180ms +- 40ms)
    delay_click_ms: int = 180
    jitter_ms: int = 40

    # Tọa độ mặc định của rương Stash tại Shoreline Hideout (2560x1440)
    # Calibrated Ground-Truth: (830, 804)
    default_stash_screen_x: int = 830
    default_stash_screen_y: int = 804

    # Ngưỡng độ sáng xác định ô có đồ (Ground-Truth Doc 48)
    brightness_threshold_item: float = 25.0
    brightness_threshold_waystone: float = 30.0

    # Bật cơ chế đọc và đồng bộ trạng thái túi đồ qua bộ nhớ RAM (Hybrid Engine)
    enable_ram_reading: bool = True

    # Chế độ tương tác ngầm qua Win32 PostMessageW (không cướp chuột và focus của người dùng)
    background_input: bool = True



# Ánh xạ từ khóa OCR sang loại StashTabType
TAB_NAME_MAPPINGS: Dict[str, StashTabType] = {
    "CURRENCY": StashTabType.CURRENCY,
    "CURR": StashTabType.CURRENCY,
    "TIỀN": StashTabType.CURRENCY,
    "TIEN": StashTabType.CURRENCY,
    "WAYSTONE": StashTabType.WAYSTONES,
    "WAYSTONES": StashTabType.WAYSTONES,
    "MAP": StashTabType.WAYSTONES,
    "MAPS": StashTabType.WAYSTONES,
    "BẢN ĐỒ": StashTabType.WAYSTONES,
    "GEM": StashTabType.GEMS,
    "GEMS": StashTabType.GEMS,
    "UNCUT": StashTabType.GEMS,
    "NGỌC": StashTabType.GEMS,
    "FRAGMENT": StashTabType.FRAGMENTS,
    "FRAGMENTS": StashTabType.FRAGMENTS,
    "FRAG": StashTabType.FRAGMENTS,
    "TABLET": StashTabType.FRAGMENTS,
    "TABLETS": StashTabType.FRAGMENTS,
    "DUMP": StashTabType.DUMP,
    "QUAD": StashTabType.DUMP,
    "LOOT": StashTabType.DUMP,
    "CARD": StashTabType.CARDS,
    "CARDS": StashTabType.CARDS,
    "DIVINATION": StashTabType.CARDS,
    "FLASK": StashTabType.FLASKS,
    "FLASKS": StashTabType.FLASKS,
    "GEAR": StashTabType.EQUIPMENT,
    "ARMOUR": StashTabType.EQUIPMENT,
    "WEAPON": StashTabType.EQUIPMENT,
}
