from typing import List, Optional
from pydantic import BaseModel
from datetime import date, datetime
from typing import Optional


class PayrollRow(BaseModel):
    employee_id: str
    name: str
    bank_name: Optional[str] = None
    account_number: str
    account_name: str
    base_salary: int
    benefit: int = 0
    loan_deduction: int
    net_salary: int
    company_id: Optional[str] = None
    company_name: Optional[str] = None


class CompanySummary(BaseModel):
    company_id: Optional[str] = None
    company_name: str
    employee_count: int
    total_net: int


class PayrollPreviewResponse(BaseModel):
    rows: List[PayrollRow]
    summary: List[CompanySummary]
    grand_total: int


class PayrollExportRequest(BaseModel):
    month: int
    year: int
    company_id: str
    employee_ids: List[str]
    transfer_date: Optional[date] = None


class THRExportRequest(BaseModel):
    year: int
    company_id: str
    employee_ids: List[str]
    transfer_date: Optional[date] = None


class ExportOverride(BaseModel):
    employee_id: str
    loan_deduction: int  # 0 = skip deduction, any other value = custom amount


class THRCashAdvance(BaseModel):
    employee_id: str
    cash_advance: int  # amount already taken as cash advance before THR payout


class PayrollExportUnifiedRequest(BaseModel):
    export_type: str  # "regular" | "thr"
    month: int
    year: int
    company_id: str
    employee_ids: List[str]
    overrides: List[ExportOverride] = []       # per-employee loan_deduction overrides (regular only)
    thr_cash_advances: List[THRCashAdvance] = []  # per-employee pre-paid cash advances (thr only)


# ── Payroll run history schemas ────────────────────────────────────────────────

class PayrollRunItemOut(BaseModel):
    id: str
    run_id: str
    employee_id: Optional[str] = None
    employee_name: str
    account_name: Optional[str] = None
    account_number: Optional[str] = None
    base_salary: int
    benefit: int = 0
    loan_deduction: int = 0
    cash_advance: int = 0
    net_amount: int
    has_override: bool
    created_at: datetime

    model_config = {"from_attributes": True}


class PayrollPaymentHistoryOut(BaseModel):
    """PayrollRunItem enriched with parent run context (month, year, export_type, run_date)."""
    id: str
    run_id: str
    employee_id: Optional[str] = None
    employee_name: str
    base_salary: int
    benefit: int = 0
    loan_deduction: int = 0
    cash_advance: int = 0
    net_amount: int
    has_override: bool
    created_at: datetime
    # From parent PayrollRun:
    month: int
    year: int
    export_type: str
    run_date: datetime


class PayrollRunOut(BaseModel):
    id: str
    run_date: datetime
    month: int
    year: int
    export_type: str
    company_id: Optional[str] = None
    company_name: Optional[str] = None
    total_amount: int
    employee_count: int
    recorded_transactions: bool
    created_at: datetime
    items: List[PayrollRunItemOut] = []

    model_config = {"from_attributes": True}
