from datetime import date, datetime
from decimal import Decimal
from uuid import UUID
from pydantic import BaseModel, Field


class ReceivableCollectionCreate(BaseModel):
    amount: Decimal = Field(gt=0)
    payment_method: str
    reference: str | None = Field(default=None, max_length=150)


class ReceivableRead(BaseModel):
    id: UUID; business_id: UUID; customer_id: UUID; sale_id: UUID | None
    original_amount: Decimal; amount_paid: Decimal; balance: Decimal; due_date: date | None; status: str
    created_at: datetime; updated_at: datetime


class ReceivableCollectionRead(BaseModel):
    id: UUID; receivable_id: UUID; customer_id: UUID; amount: Decimal; payment_method: str; reference: str | None; collected_at: datetime


class ReceivableAgingRead(BaseModel):
    receivable: ReceivableRead
    aging_bucket: str


class CustomerReceivableSummary(BaseModel):
    customer_id: UUID
    total_outstanding: Decimal
    open_receivables: list[ReceivableRead]
    paid_receivables: list[ReceivableRead]
    collections: list[ReceivableCollectionRead]


class CustomerStatementEntry(BaseModel):
    event_type: str
    occurred_at: datetime
    receivable_id: UUID
    sale_id: UUID | None
    amount: Decimal
    remaining_balance: Decimal
    reference: str | None = None



class DebtReminderCreate(BaseModel):
    message: str | None = Field(
        default=None,
        max_length=1000,
    )


class DebtReminderRead(BaseModel):
    id: UUID
    business_id: UUID
    customer_id: UUID
    created_by: UUID
    channel: str
    recipient: str
    amount_outstanding: Decimal
    message: str | None
    status: str
    error_code: str | None
    sent_at: datetime | None
    created_at: datetime

    model_config = {"from_attributes": True}
