"""POS Transaction model — individual sales from CSV POS import."""

from __future__ import annotations

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

from sqlalchemy import DateTime, ForeignKey, Index, Numeric, String
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.models.base import Base, TimestampMixin

if TYPE_CHECKING:
    from app.models.operational import LaporanShift
    from app.models.spbu import Nozzle


class PenjualanTransaksi(Base, TimestampMixin):
    """One individual sale from POS CSV import."""

    __tablename__ = "penjualan_transaksi"

    __table_args__ = (
        Index("ix_penjualan_transaksi_laporan", "laporan_shift_id"),
        Index("ix_penjualan_transaksi_plat", "plat_nomor"),
    )

    id: Mapped[int] = mapped_column(primary_key=True)
    laporan_shift_id: Mapped[int] = mapped_column(
        ForeignKey("laporan_shift.id", ondelete="CASCADE"), nullable=False
    )
    nozzle_id: Mapped[int | None] = mapped_column(
        ForeignKey("master_spbu_nozzle.id", ondelete="SET NULL"), nullable=True
    )
    plat_nomor: Mapped[str | None] = mapped_column(String(20), nullable=True)
    jenis_kendaraan: Mapped[str | None] = mapped_column(String(30), nullable=True)
    volume: Mapped[Decimal] = mapped_column(Numeric(15, 3), nullable=False, default=Decimal("0"))
    nilai: Mapped[Decimal] = mapped_column(Numeric(15, 2), nullable=False, default=Decimal("0"))
    timestamp: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)

    # Relationships
    laporan_shift: Mapped["LaporanShift"] = relationship(foreign_keys=[laporan_shift_id])
    nozzle: Mapped["Nozzle | None"] = relationship(foreign_keys=[nozzle_id])
