from pydantic import BaseModel
from decimal import Decimal
from typing import List, Dict, Optional, Any

class TreasuryAccount(BaseModel):
    """Cont de trezorerie (bancă/casă)"""
    cont: str           # 5121, 5124, 5311, 5314
    nume_cont: str      # "Bancă LEI", "Casă VALUTA" etc
    nume_banca: str     # Numele băncii din vbalanta_parteneri.nume
    sold: Decimal
    valuta: str

class TrendData(BaseModel):
    """Model pentru datele de trend - MODEL VECHI"""
    labels: List[str]
    incasari: List[Decimal]
    plati: List[Decimal]
    trezorerie: List[Decimal]
    incasari_total: Decimal
    plati_total: Decimal
    trezorerie_total: Decimal
    incasari_change: Optional[float] = None
    plati_change: Optional[float] = None
    trezorerie_change: Optional[float] = None

class TrendsResponse(BaseModel):
    """Model pentru răspunsul endpoint-ului de trenduri - MODEL NOU"""
    # Current period data
    periods: List[str]
    clienti_facturat: List[float]
    clienti_incasat: List[float]
    furnizori_facturat: List[float]
    furnizori_achitat: List[float]
    clienti_sold: List[float]
    furnizori_sold: List[float]
    trezorerie_sold: Optional[List[float]] = None
    rata_incasare_clienti: List[float]
    rata_achitare_furnizori: List[float]

    # Previous period data (for year-over-year comparison in sparklines)
    previous_periods: Optional[List[str]] = None
    clienti_facturat_prev: Optional[List[float]] = None
    clienti_incasat_prev: Optional[List[float]] = None
    furnizori_facturat_prev: Optional[List[float]] = None
    furnizori_achitat_prev: Optional[List[float]] = None
    clienti_sold_prev: Optional[List[float]] = None
    furnizori_sold_prev: Optional[List[float]] = None
    trezorerie_sold_prev: Optional[List[float]] = None

    # Metadata and analytics
    metadata: Dict[str, Any]
    growth_rates: Optional[Dict[str, float]] = None

    # Cache metadata (optional, for Telegram Bot)
    cache_hit: Optional[bool] = None
    response_time_ms: Optional[float] = None
    cache_source: Optional[str] = None

class DashboardSummary(BaseModel):
    """Model pentru toate datele dashboard-ului"""
    # CLIENȚI - statistici existente
    clienti_total_facturat: Decimal      # precdeb + debit (conturi 4111, 461)
    clienti_total_incasat: Decimal       # preccred + credit (conturi 4111, 461)
    clienti_avansuri: Decimal            # sold 419 (pasiv): credit - debit
    clienti_sold_total: Decimal          # (facturat - incasat) - avansuri
    clienti_sold_restant: Decimal        # sold cu datascad < azi
    
    # CLIENȚI - NOI câmpuri pentru sold în termen
    clienti_sold_in_termen: Decimal      # sold cu datascad >= azi
    
    # CLIENȚI - NOI detalieri restanțe (sold cu datascad < azi)
    clienti_restant_7: Decimal           # restant 1-7 zile
    clienti_restant_14: Decimal          # restant 8-14 zile
    clienti_restant_30: Decimal          # restant 15-30 zile
    clienti_restant_60: Decimal          # restant 31-60 zile
    clienti_restant_90: Decimal          # restant 61-90 zile
    clienti_restant_90plus: Decimal      # restant 90+ zile
    
    # CLIENȚI - NOI detalieri scadențe (sold cu datascad >= azi)
    clienti_scadent_7: Decimal           # scadent în 1-7 zile
    clienti_scadent_14: Decimal          # scadent în 8-14 zile
    clienti_scadent_30: Decimal          # scadent în 15-30 zile
    clienti_scadent_60: Decimal          # scadent în 31-60 zile
    clienti_scadent_90: Decimal          # scadent în 61-90 zile
    clienti_scadent_90plus: Decimal      # scadent în 90+ zile
    
    # FURNIZORI - statistici existente
    furnizori_total_facturat: Decimal    # preccred + credit (conturi 401, 404, 462)
    furnizori_total_achitat: Decimal     # precdeb + debit (conturi 401, 404, 462)
    furnizori_avansuri: Decimal          # sold 409x (activ): debit - credit
    furnizori_sold_total: Decimal        # (facturat - achitat) - avansuri
    furnizori_sold_restant: Decimal      # sold cu datascad < azi
    
    # FURNIZORI - NOI câmpuri pentru sold în termen
    furnizori_sold_in_termen: Decimal    # sold cu datascad >= azi
    
    # FURNIZORI - NOI detalieri restanțe (sold cu datascad < azi)
    furnizori_restant_7: Decimal         # restant 1-7 zile
    furnizori_restant_14: Decimal        # restant 8-14 zile
    furnizori_restant_30: Decimal        # restant 15-30 zile
    furnizori_restant_60: Decimal        # restant 31-60 zile
    furnizori_restant_90: Decimal        # restant 61-90 zile
    furnizori_restant_90plus: Decimal    # restant 90+ zile
    
    # FURNIZORI - NOI detalieri scadențe (sold cu datascad >= azi)
    furnizori_scadent_7: Decimal         # scadent în 1-7 zile
    furnizori_scadent_14: Decimal        # scadent în 8-14 zile
    furnizori_scadent_30: Decimal        # scadent în 15-30 zile
    furnizori_scadent_60: Decimal        # scadent în 31-60 zile
    furnizori_scadent_90: Decimal        # scadent în 61-90 zile
    furnizori_scadent_90plus: Decimal    # scadent în 90+ zile
    
    # TREZORERIE - existente
    treasury_accounts: List[TreasuryAccount]
    treasury_totals_by_currency: Dict[str, Decimal]
    
    # DATE SUPLIMENTARE pentru trend analysis
    clienti_facturat_luna_anterioara: Optional[Decimal] = Decimal('0')
    furnizori_facturat_luna_anterioara: Optional[Decimal] = Decimal('0')
    clienti_facturat_an_curent: Optional[Decimal] = Decimal('0')
    clienti_facturat_an_anterior: Optional[Decimal] = Decimal('0')
    furnizori_facturat_an_curent: Optional[Decimal] = Decimal('0')
    furnizori_facturat_an_anterior: Optional[Decimal] = Decimal('0')

    # SOLDURI TVA
    tva_plata_precedent: Decimal = Decimal('0')
    tva_recuperat_precedent: Decimal = Decimal('0')
    tva_plata_curent: Decimal = Decimal('0')
    tva_recuperat_curent: Decimal = Decimal('0')