from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import date, datetime
from decimal import Decimal


# ── Auth ──────────────────────────────────────────────────────
class LoginRequest(BaseModel):
    username: str
    password: str

class Token(BaseModel):
    access_token: str
    token_type: str = "bearer"

class UserOut(BaseModel):
    id: int
    username: str
    role: str
    full_name: str
    model_config = {"from_attributes": True}


# ── Staff ─────────────────────────────────────────────────────
class StaffCreate(BaseModel):
    full_name: str
    employee_id: Optional[str] = None
    contact: Optional[str] = None
    basic_salary: Optional[Decimal] = None
    category: str = 'PUMPER'
    join_date: Optional[date] = None
    notes: Optional[str] = None

class StaffUpdate(BaseModel):
    full_name: Optional[str] = None
    employee_id: Optional[str] = None
    contact: Optional[str] = None
    basic_salary: Optional[Decimal] = None
    status: Optional[str] = None
    category: Optional[str] = None
    join_date: Optional[date] = None
    notes: Optional[str] = None

class StaffOut(BaseModel):
    id: int
    employee_id: Optional[str]
    full_name: str
    contact: Optional[str]
    basic_salary: Optional[Decimal]
    status: str
    category: str
    join_date: Optional[date] = None
    notes: Optional[str] = None
    model_config = {"from_attributes": True}


# ── Pumps & Rates ─────────────────────────────────────────────
class PumpOut(BaseModel):
    id: int
    pump_code: str
    pump_number: int
    fuel_type: str
    description: Optional[str]
    status: str = 'ACTIVE'
    maintenance_reason: Optional[str] = None
    sort_order: int = 0
    model_config = {"from_attributes": True}

class PumpCreate(BaseModel):
    pump_code: str
    pump_number: int
    fuel_type: str
    description: Optional[str] = None
    sort_order: int = 0

class PumpUpdate(BaseModel):
    pump_code: Optional[str] = None
    pump_number: Optional[int] = None
    fuel_type: Optional[str] = None
    description: Optional[str] = None
    sort_order: Optional[int] = None

class PumpStatusBody(BaseModel):
    status: str
    maintenance_reason: Optional[str] = None

class FuelRateOut(BaseModel):
    id: int
    fuel_type: str
    rate: Decimal
    effective_from: date
    effective_to: Optional[date] = None
    model_config = {"from_attributes": True}


# ── Shift Templates ───────────────────────────────────────────
class ShiftTemplateCreate(BaseModel):
    name:             str
    code:             str
    start_time:       str = '00:00'
    end_time:         str = '00:00'
    crosses_midnight: bool = False
    color:            str = '#6366f1'
    is_active:        bool = True
    sort_order:       int = 0

class ShiftTemplateUpdate(BaseModel):
    name:             Optional[str] = None
    code:             Optional[str] = None
    start_time:       Optional[str] = None
    end_time:         Optional[str] = None
    crosses_midnight: Optional[bool] = None
    color:            Optional[str] = None
    is_active:        Optional[bool] = None
    sort_order:       Optional[int] = None

class ShiftTemplateOut(BaseModel):
    id:               int
    name:             str
    code:             str
    start_time:       str
    end_time:         str
    crosses_midnight: bool
    color:            str
    is_active:        bool
    sort_order:       int
    created_at:       Optional[datetime] = None
    model_config = {"from_attributes": True}


# ── Pump-Shift Configs ─────────────────────────────────────────
class PumpShiftConfigOut(BaseModel):
    id:                int
    pump_id:           int
    pump_number:       Optional[int] = None
    pump_code:         Optional[str] = None
    fuel_type:         Optional[str] = None
    shift_template_id: int
    shift_code:        Optional[str] = None
    shift_name:        Optional[str] = None
    shift_color:       Optional[str] = None
    is_active:         bool
    sort_order:        int
    model_config = {"from_attributes": True}

class PumpShiftConfigToggle(BaseModel):
    is_active: bool

# ── Pump Status (live view) ────────────────────────────────────
class PumpShiftStatus(BaseModel):
    shift_id:       Optional[int]
    shift_type:     Optional[str]
    shift_name:     Optional[str]
    shift_color:    Optional[str]
    shift_start:    Optional[str]
    shift_end:      Optional[str]
    operator_id:    Optional[int]
    operator_name:  Optional[str]
    pump_status:    str   # NOT_STARTED | OPEN | CLOSED
    ending_meter:   Optional[float]
    sale_amount:    Optional[float]

class PumpStatusOut(BaseModel):
    pump_id:     int
    pump_code:   str
    pump_number: int
    fuel_type:   str
    description: Optional[str]
    shifts:      List[PumpShiftStatus]


# ── Collection Cycles ─────────────────────────────────────────
class ShiftCollectionCycleCreate(BaseModel):
    shift_id:     int
    cash_total:   Decimal = Decimal('0')
    card_visa:    Decimal = Decimal('0')
    card_amex:    Decimal = Decimal('0')
    card_touch:   Decimal = Decimal('0')
    credit_total: Decimal = Decimal('0')
    other_income: Decimal = Decimal('0')
    shortage:     Decimal = Decimal('0')
    advance:      Decimal = Decimal('0')
    is_final:     bool = False
    notes:        Optional[str] = None

class ShiftCollectionCycleUpdate(BaseModel):
    cash_total:   Optional[Decimal] = None
    card_visa:    Optional[Decimal] = None
    card_amex:    Optional[Decimal] = None
    card_touch:   Optional[Decimal] = None
    credit_total: Optional[Decimal] = None
    other_income: Optional[Decimal] = None
    shortage:     Optional[Decimal] = None
    advance:      Optional[Decimal] = None
    is_final:     Optional[bool] = None
    notes:        Optional[str] = None

class ShiftCollectionCycleOut(BaseModel):
    id:           int
    shift_id:     int
    cycle_number: int
    cash_total:   Decimal
    card_visa:    Decimal
    card_amex:    Decimal
    card_touch:   Decimal
    credit_total: Decimal
    other_income: Decimal
    shortage:     Decimal
    advance:      Decimal
    is_final:     bool
    collected_by: Optional[int]
    collected_at: Optional[datetime]
    notes:        Optional[str]
    model_config = {"from_attributes": True}


# ── Shift sub-objects ─────────────────────────────────────────
class PumpReadingCreate(BaseModel):
    pump_id: int
    staff_id: Optional[int] = None
    starting_meter: Decimal
    ending_meter: Decimal
    testing_ltr: Decimal = Decimal('0')
    fuel_rate: Decimal

class PumpReadingPatch(BaseModel):
    staff_id:       Optional[int] = None
    starting_meter: Decimal
    ending_meter:   Decimal
    testing_ltr:    Decimal = Decimal('0')
    fuel_rate:      Decimal

class PumpReadingOut(BaseModel):
    id: int
    pump_id: int
    pump_code: Optional[str] = None
    pump_number: Optional[int] = None
    fuel_type: Optional[str] = None
    staff_id: Optional[int] = None
    pumper_name: Optional[str] = None
    starting_meter: Decimal
    ending_meter: Decimal
    meter_out: Decimal
    testing_ltr: Decimal
    sale_ltr: Decimal
    fuel_rate: Decimal
    sale_amount: Decimal
    model_config = {"from_attributes": True}

class CreditSaleCreate(BaseModel):
    customer_id: int
    pumper_id:   Optional[int] = None
    bill_no: str
    amount: Decimal
    vehicle_no: Optional[str] = None
    fuel_type: Optional[str] = None
    liters: Optional[Decimal] = None
    notes: Optional[str] = None

class CreditSaleOut(BaseModel):
    id: int
    customer_id:   int
    customer_name: Optional[str] = None
    pumper_id:     Optional[int] = None
    pumper_name:   Optional[str] = None
    bill_no: str
    amount: Decimal
    vehicle_no: Optional[str] = None
    model_config = {"from_attributes": True}

class DenominationCreate(BaseModel):
    bag_number: int = Field(ge=1, le=10)
    staff_id:   Optional[int] = None
    note_5000: int = 0
    note_2000: int = 0
    note_1000: int = 0
    note_500:  int = 0
    note_100:  int = 0
    note_50:   int = 0
    note_20:   int = 0
    note_10:   int = 0

class DenominationOut(BaseModel):
    id:               int
    bag_number:       int
    staff_id:         Optional[int] = None
    pumper_name:      Optional[str] = None
    note_5000:        int
    note_2000:        int = 0
    note_1000:        int
    note_500:         int
    note_100:         int
    note_50:          int
    note_20:          int
    note_10:          int
    calculated_total: Decimal
    model_config = {"from_attributes": True}


# ── Shift create / response ───────────────────────────────────
class ShiftCreate(BaseModel):
    record_date:    date
    shift_type:     str
    staff_id:       Optional[int] = None
    pump_readings:  List[PumpReadingCreate] = []
    cash_collected: Decimal = Decimal('0')
    card_visa:      Decimal = Decimal('0')
    card_amex:      Decimal = Decimal('0')
    card_touch:     Decimal = Decimal('0')
    credit_total:   Decimal = Decimal('0')
    other_income:   Decimal = Decimal('0')
    shortage:       Decimal = Decimal('0')
    advance:        Decimal = Decimal('0')
    credit_sales:   List[CreditSaleCreate] = []
    denominations:  List[DenominationCreate] = []
    notes:          Optional[str] = None

class ShiftUpdate(BaseModel):
    staff_id:       Optional[int] = None
    pump_readings:  Optional[List[PumpReadingCreate]] = None
    cash_collected: Optional[Decimal] = None
    card_visa:      Optional[Decimal] = None
    card_amex:      Optional[Decimal] = None
    card_touch:     Optional[Decimal] = None
    credit_total:   Optional[Decimal] = None
    other_income:   Optional[Decimal] = None
    shortage:       Optional[Decimal] = None
    advance:        Optional[Decimal] = None
    credit_sales:   Optional[List[CreditSaleCreate]] = None
    denominations:  Optional[List[DenominationCreate]] = None
    notes:          Optional[str] = None

class ShiftOut(BaseModel):
    id:               int
    record_date:      date
    shift_type:       str
    staff_id:         Optional[int]
    staff_name:       Optional[str] = None
    cash_collected:   Decimal
    card_visa:        Decimal
    card_amex:        Decimal
    card_touch:       Decimal
    credit_total:     Decimal
    other_income:     Decimal
    shortage:         Decimal
    advance:          Decimal
    total_sale_calc:  Decimal
    total_collected:  Decimal
    difference:       Decimal
    is_locked:        bool
    status:           str = 'DRAFT'
    notes:            Optional[str]
    pump_readings:    List[PumpReadingOut] = []
    credit_sales:     List[CreditSaleOut] = []
    denominations:    List[DenominationOut] = []
    collection_cycles: List[ShiftCollectionCycleOut] = []
    created_at:       Optional[datetime]
    model_config = {"from_attributes": True}

class ShiftListItem(BaseModel):
    id:              int
    record_date:     date
    shift_type:      str
    staff_name:      Optional[str] = None
    total_sale_calc: Decimal
    total_collected: Decimal
    difference:      Decimal
    is_locked:       bool
    status:          str = 'DRAFT'
    pump_count:      int = 0
    model_config = {"from_attributes": True}


# ── Credit Customers ──────────────────────────────────────────
class CustomerCreate(BaseModel):
    company_name:   str
    contact_person: Optional[str] = None
    contact_phone:  Optional[str] = None
    address:        Optional[str] = None
    credit_limit:   Decimal = Decimal('0')

class CustomerUpdate(BaseModel):
    company_name:   Optional[str] = None
    contact_person: Optional[str] = None
    contact_phone:  Optional[str] = None
    address:        Optional[str] = None
    credit_limit:   Optional[Decimal] = None
    status:         Optional[str] = None

class CustomerOut(BaseModel):
    id:              int
    company_name:    str
    contact_person:  Optional[str]
    contact_phone:   Optional[str]
    address:         Optional[str] = None
    credit_limit:    Decimal
    current_balance: Decimal
    status:          str
    model_config = {"from_attributes": True}

class CreditPaymentCreate(BaseModel):
    payment_date:   date
    amount:         Decimal
    reference_no:   Optional[str] = None
    payment_method: str = 'CASH'
    notes:          Optional[str] = None

class CreditPaymentOut(BaseModel):
    id:             int
    customer_id:    int
    payment_date:   date
    amount:         Decimal
    reference_no:   Optional[str]
    payment_method: str
    notes:          Optional[str]
    received_by:    Optional[int]
    created_at:     Optional[datetime]
    model_config = {"from_attributes": True}

class CustomerVehicleCreate(BaseModel):
    vehicle_no:   str
    vehicle_type: Optional[str] = None
    notes:        Optional[str] = None

class CustomerVehicleOut(BaseModel):
    id:           int
    customer_id:  int
    vehicle_no:   str
    vehicle_type: Optional[str]
    notes:        Optional[str]
    created_at:   Optional[datetime]
    model_config = {"from_attributes": True}

class LedgerEntry(BaseModel):
    date:        str
    type:        str   # SALE | PAYMENT
    ref:         str
    description: str
    debit:       float
    credit:      float
    balance:     float

class StockDeliveryCreate(BaseModel):
    delivery_date: date
    fuel_type:     str
    liters:        Decimal
    supplier:      Optional[str] = None
    invoice_no:    Optional[str] = None
    rate_per_ltr:  Optional[Decimal] = None
    total_cost:    Optional[Decimal] = None
    notes:         Optional[str] = None

class StockDeliveryOut(BaseModel):
    id:            int
    delivery_date: date
    fuel_type:     str
    liters:        Decimal
    supplier:      Optional[str]
    invoice_no:    Optional[str]
    rate_per_ltr:  Optional[Decimal]
    total_cost:    Optional[Decimal]
    notes:         Optional[str]
    received_by:   Optional[int]
    created_at:    Optional[datetime]
    model_config = {"from_attributes": True}

class AuditLogOut(BaseModel):
    id:         int
    user_id:    Optional[int]
    actor_name: Optional[str] = None
    action:     str
    table_name: Optional[str]
    record_id:  Optional[int]
    summary:    Optional[str]
    created_at: Optional[datetime]
    model_config = {"from_attributes": True}


# ── Dashboard ─────────────────────────────────────────────────
class FuelBreakdown(BaseModel):
    fuel_type:  str
    total_ltr:  float
    total_rs:   float

class DashboardToday(BaseModel):
    date:             date
    total_sale:       float
    cash_total:       float
    card_total:       float
    credit_total:     float
    shortage_total:   float
    shifts_completed: int
    total_ltr_today:  float
    fuel_breakdown:   List[FuelBreakdown]
    recent_shifts:    List[dict]


# ── System Settings ────────────────────────────────────────────────────────
class SystemSettingOut(BaseModel):
    id:            int
    setting_key:   str
    setting_value: str
    description:   Optional[str]
    model_config = {"from_attributes": True}

class SystemSettingUpdate(BaseModel):
    setting_value: str


# ── Roster ─────────────────────────────────────────────────────────────────
class RosterEntry(BaseModel):
    roster_date: date
    shift_type:  str
    staff_id:    int
    notes:       Optional[str] = None

class RosterOut(BaseModel):
    id:           int
    roster_date:  date
    shift_type:   str
    staff_id:     Optional[int] = None
    staff_name:   Optional[str] = None
    pumper_names: list[str] = []
    notes:        Optional[str]
    model_config = {"from_attributes": True}


# ── Leave ──────────────────────────────────────────────────────────────────
class LeaveRequestCreate(BaseModel):
    staff_id:   int
    leave_type: str
    date_from:  date
    date_to:    date
    days_count: int
    reason:     Optional[str] = None

class LeaveRequestUpdate(BaseModel):
    status:      str
    review_note: Optional[str] = None

class LeaveRequestOut(BaseModel):
    id:          int
    staff_id:    int
    staff_name:  Optional[str] = None
    leave_type:  str
    date_from:   date
    date_to:     date
    days_count:  int
    reason:      Optional[str]
    status:      str
    reviewed_by: Optional[int]
    reviewed_at: Optional[datetime]
    review_note: Optional[str]
    created_at:  Optional[datetime]
    model_config = {"from_attributes": True}

class LeaveBalanceOut(BaseModel):
    id:           int
    staff_id:     int
    staff_name:   Optional[str] = None
    year:         int
    annual_total: int
    sick_total:   int
    casual_total: int
    annual_used:  int
    sick_used:    int
    casual_used:  int
    annual_remaining: int = 0
    sick_remaining:   int = 0
    casual_remaining: int = 0
    model_config = {"from_attributes": True}


# ── Allowances ─────────────────────────────────────────────────────────────
class AllowanceCreate(BaseModel):
    staff_id:       int
    month:          int
    year:           int
    allowance_type: str
    amount:         Decimal
    notes:          Optional[str] = None

class AllowanceUpdate(BaseModel):
    amount: Decimal
    notes:  Optional[str] = None

class AllowanceOut(BaseModel):
    id:             int
    staff_id:       int
    staff_name:     Optional[str] = None
    month:          int
    year:           int
    allowance_type: str
    amount:         Decimal
    notes:          Optional[str]
    created_at:     Optional[datetime]
    model_config = {"from_attributes": True}


# ── Tank Dip Readings ──────────────────────────────────────────────────────
class TankDipReadingCreate(BaseModel):
    read_date:  date
    tank_name:  str          # LP92 | EURO3 | LAD | LADXM
    height_cm:  Decimal
    volume_ltr: Decimal

class TankDipReadingOut(BaseModel):
    id:          int
    read_date:   date
    tank_name:   str
    height_cm:   Decimal
    volume_ltr:  Decimal
    recorded_by: Optional[int]
    created_at:  Optional[datetime]
    model_config = {"from_attributes": True}


# ── Performance ────────────────────────────────────────────────────────────
class PerformanceSummary(BaseModel):
    staff_id:      int
    staff_name:    str
    shifts_worked: int
    total_liters:  float
    total_sale:    float
    days_present:  int
    score:         float


# ── User Management ─────────────────────────────────────────────────────────
class UserCreate(BaseModel):
    username:  str
    password:  str
    role:      str = 'MANAGER'
    full_name: str
    contact:   Optional[str] = None

class UserUpdate(BaseModel):
    role:      Optional[str] = None
    full_name: Optional[str] = None
    contact:   Optional[str] = None
    is_active: Optional[bool] = None

class UserPasswordReset(BaseModel):
    new_password: str

class UserFull(BaseModel):
    id:                 int
    username:           str
    role:               str
    full_name:          str
    contact:            Optional[str]
    is_active:          bool
    created_at:         Optional[datetime]
    accessible_modules: List[str] = []
    model_config = {"from_attributes": True}


class RolePagePermissionOut(BaseModel):
    role:       str
    module:     str
    can_access: bool
    model_config = {"from_attributes": True}


class RolePagePermissionSet(BaseModel):
    role:       str
    module:     str
    can_access: bool

class UserPermissionSet(BaseModel):
    module:     str
    can_view:   bool = True
    can_create: bool = True
    can_edit:   bool = True
    can_delete: bool = False

class UserPermissionOut(BaseModel):
    id:         int
    user_id:    int
    module:     str
    can_view:   bool
    can_create: bool
    can_edit:   bool
    can_delete: bool
    model_config = {"from_attributes": True}


# ── Billing / Invoices ──────────────────────────────────────────────────────
class InvoiceLineItemCreate(BaseModel):
    fuel_type:   Optional[str] = None
    description: str
    quantity:    Decimal
    unit_rate:   Decimal

class InvoiceLineItemOut(BaseModel):
    id:          int
    invoice_id:  int
    fuel_type:   Optional[str]
    description: str
    quantity:    Decimal
    unit_rate:   Decimal
    amount:      Decimal
    model_config = {"from_attributes": True}

class InvoiceCreate(BaseModel):
    invoice_type:    str
    customer_id:     Optional[int] = None
    shift_id:        Optional[int] = None
    invoice_date:    date
    due_date:        Optional[date] = None
    vat_rate:        Decimal = Decimal('0')
    payment_method:  str = 'CASH'
    customer_vat_no: Optional[str] = None
    notes:           Optional[str] = None
    line_items:      List[InvoiceLineItemCreate] = []

class InvoiceUpdate(BaseModel):
    customer_id:     Optional[int] = None
    shift_id:        Optional[int] = None
    invoice_date:    Optional[date] = None
    due_date:        Optional[date] = None
    vat_rate:        Optional[Decimal] = None
    payment_method:  Optional[str] = None
    customer_vat_no: Optional[str] = None
    notes:           Optional[str] = None
    line_items:      Optional[List[InvoiceLineItemCreate]] = None

class InvoiceOut(BaseModel):
    id:              int
    invoice_no:      str
    invoice_type:    str
    customer_id:     Optional[int]
    shift_id:        Optional[int]
    invoice_date:    date
    due_date:        Optional[date]
    subtotal:        Decimal
    vat_rate:        Decimal
    vat_amount:      Decimal
    total:           Decimal
    status:          str
    payment_method:  Optional[str]
    customer_vat_no: Optional[str]
    notes:           Optional[str]
    line_items:      List[InvoiceLineItemOut] = []
    created_by:      Optional[int]
    created_at:      Optional[datetime]
    model_config = {"from_attributes": True}


# ── Bulk Sales ──────────────────────────────────────────────────────────────
class BulkSaleCreate(BaseModel):
    sale_date:   date
    fuel_type:   str
    liters:      Decimal
    custom_rate: Decimal
    customer_id: Optional[int] = None
    vehicle_no:  Optional[str] = None
    shift_id:    Optional[int] = None
    notes:       Optional[str] = None

class BulkSaleOut(BaseModel):
    id:                int
    sale_date:         date
    fuel_type:         str
    liters:            Decimal
    custom_rate:       Decimal
    standard_rate:     Decimal
    amount:            Decimal
    rate_variance_pct: Optional[Decimal]
    customer_id:       Optional[int]
    vehicle_no:        Optional[str]
    requires_approval: bool
    approved_by:       Optional[int]
    created_by:        Optional[int]
    created_at:        Optional[datetime]
    model_config = {"from_attributes": True}


# ── Notifications ───────────────────────────────────────────────────────────
class NotificationOut(BaseModel):
    id:          int
    user_id:     Optional[int]
    target_role: Optional[str]
    type:        str
    title:       str
    message:     Optional[str]
    link:        Optional[str]
    is_read:     bool
    read_at:     Optional[datetime]
    created_at:  Optional[datetime]
    model_config = {"from_attributes": True}

class NotificationPreferenceUpdate(BaseModel):
    email_enabled:        Optional[bool] = None
    email:                Optional[str]  = None
    whatsapp_enabled:     Optional[bool] = None
    whatsapp_number:      Optional[str]  = None
    alert_unclosed_shift: Optional[bool] = None
    alert_credit_limit:   Optional[bool] = None
    alert_low_stock:      Optional[bool] = None
    alert_price_override: Optional[bool] = None

class NotificationPreferenceOut(BaseModel):
    user_id:              int
    email_enabled:        bool
    email:                Optional[str]
    whatsapp_enabled:     bool
    whatsapp_number:      Optional[str]
    alert_unclosed_shift: bool
    alert_credit_limit:   bool
    alert_low_stock:      bool
    alert_price_override: bool
    model_config = {"from_attributes": True}


# ── Stock Adjustments ───────────────────────────────────────────────────────
class StockAdjustmentCreate(BaseModel):
    adjustment_date: date
    fuel_type:       str
    adjustment_type: str
    quantity_ltr:    Decimal
    reason:          Optional[str] = None
    reference_no:    Optional[str] = None

class StockAdjustmentOut(BaseModel):
    id:              int
    adjustment_date: date
    fuel_type:       str
    adjustment_type: str
    quantity_ltr:    Decimal
    reason:          Optional[str]
    reference_no:    Optional[str]
    approved_by:     Optional[int]
    created_by:      Optional[int]
    created_at:      Optional[datetime]
    model_config = {"from_attributes": True}


# ── Expenses ────────────────────────────────────────────────────────────────
class ExpenseCreate(BaseModel):
    expense_date:   date
    category:       str
    description:    str
    amount:         Decimal
    payment_method: str = 'CASH'
    reference_no:   Optional[str] = None
    shift_id:       Optional[int] = None
    staff_id:       Optional[int] = None

class ExpenseUpdate(BaseModel):
    expense_date:   Optional[date]    = None
    category:       Optional[str]     = None
    description:    Optional[str]     = None
    amount:         Optional[Decimal] = None
    payment_method: Optional[str]     = None
    reference_no:   Optional[str]     = None

class ExpenseOut(BaseModel):
    id:             int
    expense_date:   date
    category:       str
    description:    str
    amount:         Decimal
    payment_method: str
    reference_no:   Optional[str]
    shift_id:       Optional[int]
    staff_id:       Optional[int]
    staff_name:     Optional[str] = None
    approved_by:    Optional[int]
    created_by:     Optional[int]
    created_at:     Optional[datetime]
    model_config = {"from_attributes": True}


# ── Shift Handover Note ─────────────────────────────────────────────────────
class ShiftHandoverNoteUpdate(BaseModel):
    outgoing_notes:         Optional[str] = None
    equipment_concerns:     Optional[str] = None
    cash_discrepancy_notes: Optional[str] = None

class ShiftHandoverNoteOut(BaseModel):
    id:                     int
    shift_id:               int
    outgoing_notes:         Optional[str]
    equipment_concerns:     Optional[str]
    cash_discrepancy_notes: Optional[str]
    created_by:             Optional[int]
    updated_at:             Optional[datetime]
    model_config = {"from_attributes": True}
