from datetime import datetime
from typing import List, Literal, Optional

from pydantic import BaseModel, ConfigDict, field_validator


class SettlementAccountCreate(BaseModel):
    nickname: str
    account_holder_name: str
    bank_name: Optional[str] = None
    routing_number: str  # 9 digits; encrypted before DB write
    account_number: str  # encrypted; last 4 cached
    account_type: Literal["checking", "savings"]

    @field_validator("routing_number")
    @classmethod
    def validate_routing_number(cls, v: str) -> str:
        v = v.strip()
        if not v.isdigit() or len(v) != 9:
            raise ValueError("routing_number must be exactly 9 digits")
        return v

    @field_validator("account_number")
    @classmethod
    def validate_account_number(cls, v: str) -> str:
        v = v.strip()
        if not v.isdigit() or len(v) < 4:
            raise ValueError("account_number must be numeric and at least 4 digits")
        return v


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

    id: int
    nickname: str
    account_holder_name: str
    bank_name: Optional[str]
    account_number_last4: str  # never return full number
    account_type: str
    is_active: bool
    created_at: datetime
    updated_at: Optional[datetime]


class SettlementAccountListResponse(BaseModel):
    items: List[SettlementAccountResponse]
    total: int
