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

class CategoryCreate(BaseModel): name: str = Field(min_length=1, max_length=200); description: str | None = None
class CategoryUpdate(BaseModel): name: str | None = Field(default=None, min_length=1, max_length=200); description: str | None = None; is_active: bool | None = None
class CategoryRead(BaseModel):
    id: UUID; business_id: UUID; name: str; description: str | None; is_active: bool; created_at: datetime; updated_at: datetime
    model_config = ConfigDict(from_attributes=True)
ExpenseCategoryCreate = CategoryCreate; ExpenseCategoryUpdate = CategoryUpdate; ExpenseCategoryRead = CategoryRead
OtherIncomeCategoryCreate = CategoryCreate; OtherIncomeCategoryUpdate = CategoryUpdate; OtherIncomeCategoryRead = CategoryRead
class ExpenseCreate(BaseModel):
    branch_id: UUID | None = None; category_id: UUID; description: str = Field(min_length=1, max_length=500); amount: Decimal = Field(gt=0); expense_date: date = Field(default_factory=date.today); payment_method: str; reference: str | None = Field(default=None, max_length=200); notes: str | None = None
class ExpenseUpdate(BaseModel):
    branch_id: UUID | None = None; category_id: UUID | None = None; description: str | None = Field(default=None, min_length=1, max_length=500); amount: Decimal | None = Field(default=None, gt=0); expense_date: date | None = None; payment_method: str | None = None; reference: str | None = Field(default=None, max_length=200); notes: str | None = None
class ExpenseRead(ExpenseCreate):
    id: UUID; business_id: UUID; recorded_by: UUID; status: str; created_at: datetime; updated_at: datetime
    model_config = ConfigDict(from_attributes=True)
class OtherIncomeCreate(BaseModel):
    branch_id: UUID | None = None; category_id: UUID; description: str = Field(min_length=1, max_length=500); amount: Decimal = Field(gt=0); income_date: date = Field(default_factory=date.today); reference: str | None = Field(default=None, max_length=200); notes: str | None = None
class OtherIncomeUpdate(BaseModel):
    branch_id: UUID | None = None; category_id: UUID | None = None; description: str | None = Field(default=None, min_length=1, max_length=500); amount: Decimal | None = Field(default=None, gt=0); income_date: date | None = None; reference: str | None = Field(default=None, max_length=200); notes: str | None = None
class OtherIncomeRead(OtherIncomeCreate):
    id: UUID; business_id: UUID; recorded_by: UUID; status: str; created_at: datetime; updated_at: datetime
    model_config = ConfigDict(from_attributes=True)
