"""Schemas for the penerimaan (BBM receipt) module."""

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

from pydantic import BaseModel, ConfigDict, field_validator


class PenerimaanItemCreate(BaseModel):
    penebusan_item_id: int | None = None
    produk_id: int
    tangki_id: int
    dipstick_sebelum_mm: Decimal
    dipstick_sesudah_mm: Decimal
    atg_sebelum_mm: Decimal | None = None
    atg_sesudah_mm: Decimal | None = None


class PenerimaanCreate(BaseModel):
    penebusan_id: int
    tanggal: date
    tgl_jam_keluar_terminal: datetime | None = None
    jam_tiba: time | None = None
    jam_berangkat: time | None = None
    no_polisi: str | None = None
    shipment_no: str | None = None
    nama_pengemudi: str | None = None
    no_lo: str | None = None
    density_obs: Decimal | None = None
    temp_obs: Decimal | None = None
    density_ons: Decimal | None = None
    temp_ons: Decimal | None = None
    catatan: str | None = None
    items: list[PenerimaanItemCreate]

    @field_validator("items")
    @classmethod
    def items_not_empty(cls, v: list) -> list:
        if not v:
            raise ValueError("Minimal satu item penerimaan harus diisi")
        return v


class PenerimaanFotoResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    penerimaan_id: int
    penerimaan_item_id: int | None
    tipe: str
    url: str


class PenerimaanItemResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    penerimaan_id: int
    penebusan_item_id: int | None
    produk_id: int
    produk_nama: str
    tangki_id: int
    tangki_nama: str
    dipstick_sebelum_mm: Decimal
    volume_sebelum: Decimal
    dipstick_sesudah_mm: Decimal
    volume_sesudah: Decimal
    volume_diterima: Decimal
    atg_sebelum_mm: Decimal | None
    atg_sesudah_mm: Decimal | None
    fotos: list[PenerimaanFotoResponse]


class PenerimaanResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    spbu_id: int
    penebusan_id: int
    penebusan_booking_code: str
    penebusan_no_so: str | None
    tanggal: date
    tgl_jam_keluar_terminal: datetime | None
    jam_tiba: time | None
    jam_berangkat: time | None
    no_polisi: str | None
    shipment_no: str | None
    nama_pengemudi: str | None
    no_lo: str | None
    density_obs: Decimal | None
    temp_obs: Decimal | None
    density_ons: Decimal | None
    temp_ons: Decimal | None
    catatan: str | None
    items: list[PenerimaanItemResponse]
    fotos: list[PenerimaanFotoResponse]  # only general fotos (item_id=None)
    total_volume_diterima: Decimal
    created_by_name: str | None
    created_at: datetime | None
    status: str = "draft"
    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
    unlocked_by_name: Optional[str] = None
    unlocked_at: Optional[datetime] = None
    unlock_reason: Optional[str] = None


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


class UnlockRequest(BaseModel):
    alasan: str
