from datetime import datetime
from decimal import Decimal
from uuid import UUID

from pydantic import BaseModel, Field, model_validator


class DayClosePeriod(BaseModel):
    branch_id: UUID
    period_start: datetime
    period_end: datetime

    @model_validator(mode="after")
    def ordered_period(self):
        if self.period_start.tzinfo is None or self.period_end.tzinfo is None:
            raise ValueError("Period start and end must include a timezone.")
        if self.period_end <= self.period_start:
            raise ValueError("Period end must be after period start.")
        return self


class DayCloseCreate(DayClosePeriod):
    counted_cash: Decimal = Field(ge=0, max_digits=14, decimal_places=2)
    notes: str | None = Field(default=None, max_length=2000)


class DayClosePreview(DayClosePeriod):
    expected_cash: Decimal


class DayCloseResponse(DayCloseCreate):
    id: UUID
    business_id: UUID
    expected_cash: Decimal
    difference: Decimal
    closed_by: UUID
    closed_at: datetime

    model_config = {"from_attributes": True}
