"""Pemindahan Produk model — tracks product transfers between tanks."""

from __future__ import annotations

from datetime import date
from decimal import Decimal
from typing import TYPE_CHECKING

from sqlalchemy import Date, ForeignKey, Index, Numeric, String, Text, Time
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.models.base import Base, TimestampMixin

if TYPE_CHECKING:
    from app.models.product import Produk
    from app.models.spbu import Tangki
    from app.models.user import User


class PemindahanProduk(Base, TimestampMixin):
    """One product transfer event between tanks."""

    __tablename__ = "pemindahan_produk"

    __table_args__ = (
        Index("ix_pemindahan_spbu_id", "spbu_id"),
    )

    id: Mapped[int] = mapped_column(primary_key=True)
    spbu_id: Mapped[int] = mapped_column(
        ForeignKey("master_spbu.id", ondelete="CASCADE"), nullable=False
    )
    tanggal: Mapped[date] = mapped_column(Date, nullable=False)
    jam: Mapped[str | None] = mapped_column(Time, nullable=True)

    tangki_sumber_id: Mapped[int] = mapped_column(
        ForeignKey("master_spbu_tangki.id", ondelete="RESTRICT"), nullable=False
    )
    produk_lama_id: Mapped[int | None] = mapped_column(
        ForeignKey("master_produk.id", ondelete="SET NULL"), nullable=True
    )
    tangki_tujuan_id: Mapped[int] = mapped_column(
        ForeignKey("master_spbu_tangki.id", ondelete="RESTRICT"), nullable=False
    )

    volume_sumber_sebelum: Mapped[Decimal] = mapped_column(
        Numeric(15, 3), nullable=False, default=Decimal("0")
    )
    volume_tujuan_sebelum: Mapped[Decimal] = mapped_column(
        Numeric(15, 3), nullable=False, default=Decimal("0")
    )
    volume_tujuan_sesudah: Mapped[Decimal] = mapped_column(
        Numeric(15, 3), nullable=False, default=Decimal("0")
    )
    volume_masuk: Mapped[Decimal] = mapped_column(
        Numeric(15, 3), nullable=False, default=Decimal("0")
    )
    losses_transfer: Mapped[Decimal] = mapped_column(
        Numeric(15, 3), nullable=False, default=Decimal("0")
    )

    catatan: Mapped[str | None] = mapped_column(Text, nullable=True)
    dilakukan_oleh: Mapped[int | None] = mapped_column(
        ForeignKey("master_user.id", ondelete="SET NULL"), nullable=True
    )

    # Relationships
    tangki_sumber: Mapped["Tangki"] = relationship(foreign_keys=[tangki_sumber_id])
    tangki_tujuan: Mapped["Tangki"] = relationship(foreign_keys=[tangki_tujuan_id])
    produk_lama: Mapped["Produk | None"] = relationship(foreign_keys=[produk_lama_id])
    user: Mapped["User | None"] = relationship(foreign_keys=[dilakukan_oleh])
