"""
Savage Salvage & Deconstruction Engine for FreeExile.
Guarantees a permanent hard price floor for grinders by converting any discarded
equipment into Bloodstone Dust (Bụi Huyết Cốt) and assembling Primal Bloodstones.
"""

from typing import Dict, Any, Tuple
from server.economy.economy_types import SalvageYield, SavageCurrencyType
from server.world.primal_stones_crafting import GearItem, ItemRarity


class SalvageEngine:
    SHARDS_PER_BLOODSTONE = 20

    def __init__(self) -> None:
        self.total_items_salvaged = 0
        self.total_dust_produced = 0
        self.total_bloodstones_assembled = 0

    def calculate_yield(self, item: GearItem) -> SalvageYield:
        """
        Calculates dust shards and currency fragments from deconstructing gear.
        Formula scales with rarity, item level, and affix count.
        """
        base_shards = 1
        bonus_fragments: Dict[str, int] = {}

        if item.rarity == ItemRarity.PHAM_PHAM:
            base_shards = 2
        elif item.rarity == ItemRarity.LINH_PHAM:
            base_shards = 5 + len(item.affixes)
        elif item.rarity == ItemRarity.CUC_PHAM:
            base_shards = 12 + (len(item.affixes) * 2)
            if item.item_level >= 75:
                bonus_fragments["MANH_CO_COT_AN"] = 1
        elif item.rarity == ItemRarity.THAN_THOAI:
            base_shards = 25 + (len(item.affixes) * 3)
            bonus_fragments["MANH_U_MINH_COT_DINH"] = 1
            if item.item_level >= 80:
                bonus_fragments["MANH_CO_COT_AN"] = 2

        # Endgame iLvl multiplier
        if item.item_level >= 85:
            base_shards = int(base_shards * 1.5)
        elif item.item_level >= 75:
            base_shards = int(base_shards * 1.25)

        full_bloodstones = base_shards // self.SHARDS_PER_BLOODSTONE
        remainder_shards = base_shards % self.SHARDS_PER_BLOODSTONE

        return SalvageYield(
            dust_shards=base_shards,
            primal_bloodstones_assembled=full_bloodstones,
            bonus_fragments=bonus_fragments,
            item_uuid=item.item_uuid,
            item_name=item.item_name
        )

    def process_salvage(
        self,
        item: GearItem,
        current_player_dust: int = 0
    ) -> Tuple[SalvageYield, int, int]:
        """
        Executes salvage and updates player currency inventory.
        Returns: (yield_info, updated_player_dust, bloodstones_awarded)
        """
        res = self.calculate_yield(item)
        new_total_dust = current_player_dust + res.dust_shards
        awarded_bloodstones = new_total_dust // self.SHARDS_PER_BLOODSTONE
        remaining_dust = new_total_dust % self.SHARDS_PER_BLOODSTONE

        self.total_items_salvaged += 1
        self.total_dust_produced += res.dust_shards
        self.total_bloodstones_assembled += awarded_bloodstones

        return res, remaining_dust, awarded_bloodstones
