"""Schemas for Executive Financial War Room & Cashflow Runway."""

from __future__ import annotations

from datetime import date, datetime
from decimal import Decimal
from enum import Enum

from pydantic import BaseModel, Field


class BusinessPillarEnum(str, Enum):
    PILLAR_1_EPC = "pillar_1_epc_contracting"
    PILLAR_2_FLEET = "pillar_2_fleet_logistics"
    PILLAR_3_EQUIPMENT = "pillar_3_equipment_rental"
    PILLAR_4_MATERIALS = "pillar_4_materials_earthwork"


class PillarFinancialSummary(BaseModel):
    pillar_id: BusinessPillarEnum
    pillar_name: str
    total_revenue: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    total_cost: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    gross_profit: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    gross_margin_percentage: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    receivables_pending: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    payables_pending: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    active_contracts_count: int = 0
    risk_level: str = "LOW"  # LOW, MEDIUM, HIGH


class CashflowForecastDay(BaseModel):
    date_str: str
    expected_inflow: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    expected_outflow: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    net_daily: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    projected_balance: Decimal = Field(default_factory=lambda: Decimal("0.0000"))


class CashflowRunwaySummary(BaseModel):
    current_cash_balance: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    total_expected_inflow_30d: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    total_expected_outflow_30d: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    net_runway_days: int = 90
    stress_test_delay_days: int = 0
    liquidity_risk_alert: bool = False
    lowest_balance: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    risk_date: str | None = None
    forecast_30d: list[CashflowForecastDay] = Field(default_factory=list)


class ContractMarginAlert(BaseModel):
    project_code: str
    project_name: str
    client_name: str
    contract_value: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    accumulated_billed: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    accumulated_cost: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    current_margin_pct: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    planned_margin_pct: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    alert_status: str = "NORMAL"  # NORMAL, WARNING_DILUTION, CRITICAL_OVERRUN
    root_cause: str | None = None


class ExecutiveWarRoomData(BaseModel):
    as_of_date: date
    generated_at: datetime
    company_tax_id: str = "0202111150"
    company_name: str = "CÔNG TY TNHH XÂY DỰNG ĐỊNH SƠN"
    total_revenue_ytd: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    total_cost_ytd: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    total_gross_profit_ytd: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    overall_margin_percentage: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    pillars_breakdown: list[PillarFinancialSummary] = Field(default_factory=list)
    cashflow_runway: CashflowRunwaySummary
    margin_alerts: list[ContractMarginAlert] = Field(default_factory=list)
