"""Schemas for the expenses module."""

from datetime import date, datetime
from decimal import Decimal
from typing import Literal, Optional

from pydantic import BaseModel, ConfigDict


class ExpenseKategoriResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    spbu_id: int | None
    nama: str
    urutan: int
    is_active: bool


class ExpenseCreate(BaseModel):
    tanggal: date
    kategori_id: int
    keterangan: str | None = None
    jumlah: Decimal
    laporan_shift_id: int | None = None


class ExpenseUpdate(BaseModel):
    kategori_id: int | None = None
    keterangan: str | None = None
    jumlah: Decimal | None = None


class ExpenseResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    spbu_id: int
    laporan_shift_id: Optional[int] = None
    tanggal: date
    kategori_id: int
    kategori_nama: str
    keterangan: Optional[str] = None
    jumlah: Decimal
    bukti_url: Optional[str] = None
    status: str = "draft"
    created_by_name: Optional[str] = None
    submitted_by_name: Optional[str] = None
    submitted_at: Optional[datetime] = None
    reviewed_by_name: Optional[str] = None
    reviewed_at: Optional[datetime] = None
    catatan_review: Optional[str] = None
    recalled_by_name: Optional[str] = None
    recalled_at: Optional[datetime] = None
    unlocked_by_name: Optional[str] = None
    unlocked_at: Optional[datetime] = None
    unlock_reason: Optional[str] = None
    created_at: datetime


class ReviewRequest(BaseModel):
    action: Literal["approve", "reject"]
    catatan: Optional[str] = None


class UnlockRequest(BaseModel):
    alasan: str


class KategoriCreate(BaseModel):
    nama: str
    urutan: int = 0


class KategoriUpdate(BaseModel):
    nama: str | None = None
    urutan: int | None = None
    is_active: bool | None = None
