"""Schemas for the penebusan (BBM procurement) module."""

from datetime import date, datetime
from decimal import Decimal

from pydantic import BaseModel, ConfigDict


# ---------------------------------------------------------------------------
# Input schemas
# ---------------------------------------------------------------------------

class PenebusanItemInput(BaseModel):
    produk_id: int
    kode_item_pertamina: str | None = None
    volume_pesan: Decimal
    tanggal_kirim: date | None = None
    sent_to_text: str | None = None


class PenebusanCreate(BaseModel):
    tanggal: date
    booking_code: str
    no_so: str | None = None
    items: list[PenebusanItemInput]
    subtotal: Decimal = Decimal("0")
    discount: Decimal = Decimal("0")
    ppn: Decimal = Decimal("0")
    pph22: Decimal = Decimal("0")
    pbbkb: Decimal = Decimal("0")
    rounding: Decimal = Decimal("0")
    debit_credit: Decimal = Decimal("0")
    total: Decimal = Decimal("0")


class PenebusanUpdate(BaseModel):
    tanggal: date | None = None
    booking_code: str | None = None
    no_so: str | None = None
    items: list[PenebusanItemInput] | None = None
    subtotal: Decimal | None = None
    discount: Decimal | None = None
    ppn: Decimal | None = None
    pph22: Decimal | None = None
    pbbkb: Decimal | None = None
    rounding: Decimal | None = None
    debit_credit: Decimal | None = None
    total: Decimal | None = None


class SetSORequest(BaseModel):
    no_so: str


# ---------------------------------------------------------------------------
# Response schemas
# ---------------------------------------------------------------------------

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

    id: int
    produk_id: int
    produk_nama: str
    produk_kode: str
    kode_item_pertamina: str | None
    volume_pesan: Decimal
    volume_diterima: Decimal
    tanggal_kirim: date | None
    sent_to_text: str | None


class PenebusanResponse(BaseModel):
    """Summary response for list views."""

    model_config = ConfigDict(from_attributes=True)

    id: int
    spbu_id: int
    tanggal: date
    booking_code: str
    no_so: str | None
    status: str
    total: Decimal
    item_count: int
    total_volume_pesan: Decimal
    total_volume_diterima: Decimal
    products_summary: str  # e.g. "Pertamax (8000L), Pertalite (16000L)"
    pdf_do_url: str | None
    pdf_bukti_bayar_url: str | None
    created_by_name: str | None
    created_at: datetime | None


class PenebusanDetailResponse(PenebusanResponse):
    """Full detail response including items and cost breakdown."""

    items: list[PenebusanItemResponse]
    subtotal: Decimal
    discount: Decimal
    ppn: Decimal
    pph22: Decimal
    pbbkb: Decimal
    rounding: Decimal
    debit_credit: Decimal
    has_penerimaan: bool = False


# ---------------------------------------------------------------------------
# PDF parse schemas
# ---------------------------------------------------------------------------

class ParsedPDFItem(BaseModel):
    kode_item_pertamina: str
    product_name: str  # raw name from PDF
    produk_id: int | None = None  # None if unmatched
    produk_nama: str | None = None  # matched product name
    volume_liter: Decimal
    no_so: str | None = None
    tanggal_kirim: date | None = None
    sent_to_text: str | None = None


class ParsedPDFResult(BaseModel):
    booking_code: str
    tanggal: date
    items: list[ParsedPDFItem]
    subtotal: Decimal = Decimal("0")
    discount: Decimal = Decimal("0")
    ppn: Decimal = Decimal("0")
    pph22: Decimal = Decimal("0")
    pbbkb: Decimal = Decimal("0")
    rounding: Decimal = Decimal("0")
    debit_credit: Decimal = Decimal("0")
    total: Decimal = Decimal("0")
    warnings: list[str] = []
