"""
Server-Authoritative Inflation Monitor & Dynamic Drop Rate Elasticity (DDRE) for FreeExile.
Monitors Faucets vs Sinks in real-time, calculates Server Inflation Index (SII),
and adjusts dynamic drop modifiers to prevent hyperinflation.
"""

from typing import Dict, Any
from server.economy.economy_types import ServerEconomyMetrics


class InflationMonitor:
    def __init__(self, market_tax_rate: float = 0.05) -> None:
        self.market_tax_rate = market_tax_rate
        self.metrics = ServerEconomyMetrics()
        self.total_market_tax_burned = 0

    def record_faucet(self, currency_name: str, amount: int) -> None:
        """Records currency generated into circulation (drop, quest, salvage)."""
        current = self.metrics.total_currency_faucets.get(currency_name, 0)
        self.metrics.total_currency_faucets[currency_name] = current + amount

    def record_crafting_sink(self, currency_name: str, amount: int) -> None:
        """Records currency permanently consumed/burned in crafting."""
        current = self.metrics.total_crafting_burns.get(currency_name, 0)
        self.metrics.total_crafting_burns[currency_name] = current + amount

    def record_market_trade_tax_burn(self, currency_name: str, trade_amount: int) -> int:
        """
        Calculates and burns market transaction tax (e.g. 5%).
        Returns the burned fee amount (removed permanently from economy).
        """
        tax_amount = max(1, int(trade_amount * self.market_tax_rate))
        current = self.metrics.total_market_tax_burns.get(currency_name, 0)
        self.metrics.total_market_tax_burns[currency_name] = current + tax_amount
        self.total_market_tax_burned += tax_amount
        return tax_amount

    def record_item_salvage(self, count: int = 1) -> None:
        self.metrics.total_items_salvaged += count

    def record_item_corruption_destroy(self, count: int = 1) -> None:
        self.metrics.total_items_destroyed_by_corruption += count

    def calculate_server_inflation_index(self, currency_name: str = "HUYET_HON_THACH") -> float:
        """
        Computes Server Inflation Index (SII):
        SII = Total Faucets / Max(1, Total Sinks)
        Healthy target: 0.85 <= SII <= 1.10
        """
        faucets = self.metrics.total_currency_faucets.get(currency_name, 0)
        craft_sinks = self.metrics.total_crafting_burns.get(currency_name, 0)
        tax_sinks = self.metrics.total_market_tax_burns.get(currency_name, 0)
        total_sinks = craft_sinks + tax_sinks

        if total_sinks == 0:
            return 1.0 if faucets == 0 else 1.5

        return round(faucets / total_sinks, 3)

    def get_dynamic_drop_modifier(self, currency_name: str = "HUYET_HON_THACH") -> float:
        """
        Dynamic Drop Rate Elasticity (DDRE):
        Scales drop rates inversely with inflation pressure to protect purchasing power.
        """
        sii = self.calculate_server_inflation_index(currency_name)
        if sii <= 1.05:
            return 1.0    # Optimal baseline
        elif sii <= 1.25:
            return 0.92   # Mild elasticity damping
        else:
            return 0.80   # Strong counter-inflation damping

    def get_economy_dashboard_report(self) -> Dict[str, Any]:
        """Provides a comprehensive health report for GM and Game Designer."""
        primary = "HUYET_HON_THACH"
        sii = self.calculate_server_inflation_index(primary)
        drop_mod = self.get_dynamic_drop_modifier(primary)

        status = "HEALTHY_EQUILIBRIUM"
        if sii > 1.20:
            status = "INFLATION_WARNING"
        elif sii < 0.80:
            status = "DEFLATION_BURNING"

        return {
            "status": status,
            "primary_currency": primary,
            "server_inflation_index": sii,
            "dynamic_drop_multiplier": drop_mod,
            "total_faucets": self.metrics.total_currency_faucets,
            "total_craft_sinks": self.metrics.total_crafting_burns,
            "total_market_tax_burns": self.metrics.total_market_tax_burns,
            "total_items_salvaged": self.metrics.total_items_salvaged,
            "total_items_destroyed_by_corruption": self.metrics.total_items_destroyed_by_corruption
        }
