from datetime import datetime

from sqlalchemy import DateTime, Float, ForeignKey, Integer, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.core.database import Base


class SupplierCatalog(Base):
    __tablename__ = "supplier_catalogs"

    id: Mapped[int] = mapped_column(primary_key=True, index=True)
    catalog_name: Mapped[str] = mapped_column(String(180), nullable=False, index=True)
    supplier_name: Mapped[str | None] = mapped_column(String(180), nullable=True, index=True)
    source_file_name: Mapped[str | None] = mapped_column(String(255), nullable=True)
    total_items: Mapped[int] = mapped_column(Integer, nullable=False, server_default="0")
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        server_default=func.now(),
        onupdate=func.now(),
        nullable=False,
    )

    items = relationship("SupplierCatalogItem", back_populates="catalog", cascade="all, delete-orphan")


class SupplierCatalogItem(Base):
    __tablename__ = "supplier_catalog_items"

    id: Mapped[int] = mapped_column(primary_key=True, index=True)
    catalog_id: Mapped[int] = mapped_column(ForeignKey("supplier_catalogs.id", ondelete="CASCADE"), nullable=False, index=True)
    source_name: Mapped[str] = mapped_column(String(180), nullable=False, index=True)
    source_lot_code: Mapped[str | None] = mapped_column(String(120), nullable=True, index=True)
    source_supplier_name: Mapped[str | None] = mapped_column(String(180), nullable=True, index=True)
    product_code: Mapped[str | None] = mapped_column(String(120), nullable=True, index=True)
    final_price_vat: Mapped[float | None] = mapped_column(Float, nullable=True)
    vat_rate: Mapped[float | None] = mapped_column(Float, nullable=True)
    weight_kg: Mapped[float | None] = mapped_column(Float, nullable=True)
    unit_price_per_kg: Mapped[float | None] = mapped_column(Float, nullable=True)
    category: Mapped[str | None] = mapped_column(String(120), nullable=True)
    notes: Mapped[str | None] = mapped_column(Text, nullable=True)
    units_per_pack: Mapped[float | None] = mapped_column(Float, nullable=True)
    liters_per_unit: Mapped[float | None] = mapped_column(Float, nullable=True)
    sort_order: Mapped[int] = mapped_column(Integer, nullable=False, server_default="0")
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        server_default=func.now(),
        onupdate=func.now(),
        nullable=False,
    )

    catalog = relationship("SupplierCatalog", back_populates="items")
