"""
Folio schemas for guest account management.
"""
from typing import Optional, List
from datetime import datetime
from pydantic import BaseModel, Field

from app.models.folio import FolioStatus


class FolioItemBase(BaseModel):
    """Base folio item schema."""
    department_code: str = Field(..., max_length=20)
    description: str = Field(..., min_length=1, max_length=500)
    quantity: float = Field(1.0, gt=0)
    unit_price: float = Field(..., ge=0)
    tax_rate: float = Field(0.0, ge=0, le=100)
    reference: Optional[str] = Field(None, max_length=100)


class FolioItemCreate(FolioItemBase):
    """Schema for creating a folio item."""
    pass


class FolioItemResponse(FolioItemBase):
    """Schema for folio item response."""
    id: int
    folio_id: int
    total_ht: float
    total_ttc: float
    posted_by_id: Optional[int] = None
    is_voided: bool
    voided_at: Optional[datetime] = None
    voided_reason: Optional[str] = None
    created_at: datetime

    class Config:
        from_attributes = True


class FolioItemVoid(BaseModel):
    """Schema for voiding a folio item."""
    reason: str = Field(..., min_length=1, max_length=500)


class FolioResponse(BaseModel):
    """Schema for folio response."""
    id: int
    reservation_id: int
    status: FolioStatus
    folio_number: str
    total_charges: float
    total_payments: float
    balance: float
    currency: str
    closed_at: Optional[datetime] = None
    notes: Optional[str] = None
    items: List[FolioItemResponse] = []
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class FolioSummary(BaseModel):
    """Schema for folio summary by department."""
    folio_id: int
    folio_number: str
    by_department: List[dict]
    subtotal_ht: float
    total_tax: float
    total_ttc: float
    total_payments: float
    balance: float
    currency: str


class FolioSplitRequest(BaseModel):
    """Schema for splitting a folio."""
    item_ids: List[int] = Field(..., min_length=1)
    new_folio_notes: Optional[str] = None


class TransferChargeRequest(BaseModel):
    """Schema for transferring a charge to another folio."""
    item_id: int
    target_folio_id: int
    reason: Optional[str] = None
