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

from pydantic import BaseModel, ConfigDict, computed_field

from src.apps.fee_settlement.schemas.settlement_account import SettlementAccountResponse


class FeeSettlementRunResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    settlement_date: date
    status: str
    transaction_count: int
    total_fee_cents: int
    tsys_transaction_id: Optional[str]
    triggered_by: str
    initiated_at: Optional[datetime]
    settled_at: Optional[datetime]
    retry_count: int
    last_error: Optional[str]
    settlement_account: Optional[SettlementAccountResponse]

    @computed_field  # type: ignore[misc]
    @property
    def total_fee_dollars(self) -> float:
        return round(self.total_fee_cents / 100, 2)


class FeeSettlementRunListResponse(BaseModel):
    items: List[FeeSettlementRunResponse]
    total: int
    page: int
    per_page: int


class SettlementRunTransactionItem(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    txn_literal: Optional[str]
    merchant_id: int
    merchant_name: Optional[str] = None
    txn_amount: Optional[float]
    platform_fee_amount: Optional[float]
    occurred_at: Optional[datetime] = None

    @computed_field  # type: ignore[misc]
    @property
    def platform_fee_cents(self) -> int:
        if self.platform_fee_amount is None:
            return 0
        return int(round(self.platform_fee_amount * 100))


class SettlementRunTransactionList(BaseModel):
    items: List[SettlementRunTransactionItem]
    total: int
    page: int
    per_page: int
