"""Anomali detection model — flags suspicious transactions for review."""

from __future__ import annotations

import enum
from typing import TYPE_CHECKING

from datetime import datetime

from sqlalchemy import DateTime, ForeignKey, Index, JSON, String, Text
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.product import Produk
    from app.models.spbu import Nozzle
    from app.models.user import User


class TipeAnomali(str, enum.Enum):
    QUOTA_EXCEEDED = "quota_exceeded"
    DOUBLE_DIP = "double_dip"
    METER_DISCREPANCY = "meter_discrepancy"
    LOSSES_EXCEEDED = "losses_exceeded"
    NEGATIVE_STOCK = "negative_stock"


class StatusAnomali(str, enum.Enum):
    NEW = "new"
    INVESTIGATING = "investigating"
    CLOSED_VALID = "closed_valid"
    FALSE_POSITIVE = "false_positive"


class AnomaliRecord(Base, TimestampMixin):
    """One anomaly record flagged by the system or manually."""

    __tablename__ = "anomali_records"

    __table_args__ = (
        Index("ix_anomali_spbu_id", "spbu_id"),
        Index("ix_anomali_status", "status"),
        Index("ix_anomali_tipe", "tipe"),
    )

    id: Mapped[int] = mapped_column(primary_key=True)
    spbu_id: Mapped[int] = mapped_column(
        ForeignKey("master_spbu.id", ondelete="CASCADE"), nullable=False
    )
    tipe: Mapped[str] = mapped_column(String(30), nullable=False)
    laporan_shift_id: Mapped[int | None] = mapped_column(
        ForeignKey("laporan_shift.id", ondelete="SET NULL"), nullable=True, index=True
    )
    produk_id: Mapped[int | None] = mapped_column(
        ForeignKey("master_produk.id", ondelete="SET NULL"), nullable=True
    )
    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)
    deskripsi: Mapped[str | None] = mapped_column(Text, nullable=True)
    detail: Mapped[dict | None] = mapped_column(JSON, nullable=True)
    status: Mapped[str] = mapped_column(
        String(20), nullable=False, default=StatusAnomali.NEW
    )
    resolved_at: Mapped[datetime | None] = mapped_column(
        DateTime(timezone=True), nullable=True
    )
    resolved_by_id: Mapped[int | None] = mapped_column(
        ForeignKey("master_user.id", ondelete="SET NULL"), nullable=True
    )
    catatan_resolusi: Mapped[str | None] = mapped_column(Text, nullable=True)
    assigned_to: Mapped[int | None] = mapped_column(
        ForeignKey("master_user.id", ondelete="SET NULL"), nullable=True
    )
    notes: Mapped[str | None] = mapped_column(Text, nullable=True)

    # Relationships
    laporan_shift: Mapped["LaporanShift | None"] = relationship(foreign_keys=[laporan_shift_id])
    produk: Mapped["Produk | None"] = relationship(foreign_keys=[produk_id])
    nozzle: Mapped["Nozzle | None"] = relationship(foreign_keys=[nozzle_id])
    resolved_by: Mapped["User | None"] = relationship(foreign_keys=[resolved_by_id])
    assigned_user: Mapped["User | None"] = relationship(foreign_keys=[assigned_to])
