"""Schemas for the stock adjustment (sounding) module."""

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

from pydantic import BaseModel, ConfigDict

from app.models.operational import StatusLaporan


class StockAdjustmentItemInput(BaseModel):
    """Input for a single tank sounding row."""

    tangki_id: int
    dipstick_manual_mm: Decimal | None = None        # optional — e.g. manual stick not possible
    dipstick_digital_mm: Decimal                     # always required in input payload
    volume_digital_liter_override: Decimal | None = None  # optional user override for digital volume


class StockAdjustmentCreate(BaseModel):
    """Payload to create a new stock adjustment."""

    tanggal: date
    shift_id: int
    items: list[StockAdjustmentItemInput]


class StockAdjustmentUpdate(BaseModel):
    """Payload to replace tank rows on a DRAFT stock adjustment."""

    items: list[StockAdjustmentItemInput]


class ReviewRequest(BaseModel):
    """Payload for reviewing (approving or rejecting) a submitted stock adjustment."""

    action: Literal["approve", "reject"]
    catatan: str | None = None


class UnlockRequest(BaseModel):
    """Payload for unlocking an approved/locked stock adjustment."""

    alasan: str


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

    id: int
    stock_adjustment_item_id: int
    tipe: str  # 'manual' | 'digital'
    url: str


class StockAdjustmentItemResponse(BaseModel):
    """Enriched response for a single tank sounding row."""

    model_config = ConfigDict(from_attributes=True)

    id: int
    tangki_id: int
    tangki_nama: str
    produk_nama: str
    kapasitas_liter: Decimal
    dipstick_manual_mm: Decimal | None
    volume_manual_liter: Decimal | None
    dipstick_digital_mm: Decimal | None
    volume_digital_liter: Decimal | None
    volume_final_liter: Decimal | None
    fotos: list[StockItemFotoResponse] = []


class StockAdjustmentResponse(BaseModel):
    """Summary response for a stock adjustment (list view)."""

    model_config = ConfigDict(from_attributes=True)

    id: int
    spbu_id: int
    shift_id: int
    shift_nama: str
    tanggal: date
    status: StatusLaporan
    submitted_by_name: str | None
    submitted_at: datetime | None
    reviewed_by_name: str | None
    reviewed_at: datetime | None
    catatan_review: str | None
    unlock_reason: str | None
    recalled_by_name: str | None
    recalled_at: datetime | None
    unlocked_by_name: str | None
    unlocked_at: datetime | None
    item_count: int
    total_volume_final: Decimal


class StockAdjustmentDetailResponse(StockAdjustmentResponse):
    """Full detail response including all tank sounding rows."""

    items: list[StockAdjustmentItemResponse]


class StockInitResponse(BaseModel):
    """Pre-fill data per tank — last known volume/dipstick for starting a new sounding."""

    tangki_id: int
    tangki_nama: str
    produk_nama: str
    kapasitas_liter: Decimal
    last_volume_final: Decimal | None       # None if no prior sounding exists
    last_dipstick_digital_mm: Decimal | None
    is_first_time: bool                     # True when no prior StockAdjustmentItem found
