"""TaxRateCache ORM model — DB-backed TaxJar rate cache with TTL."""
from datetime import datetime
from typing import Optional

from sqlalchemy import Integer, Float, String, DateTime, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column

from src.apps.base.models.base import Base


class TaxRateCache(Base):
    __tablename__ = "tax_rate_cache"
    __table_args__ = (UniqueConstraint("zip", "country", name="uq_tax_rate_zip_country"),)

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    zip: Mapped[str] = mapped_column(String(10), nullable=False, index=True)
    city: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    state: Mapped[Optional[str]] = mapped_column(String(10), nullable=True)
    country: Mapped[str] = mapped_column(String(10), nullable=False, default="US")
    label: Mapped[str] = mapped_column(String(255), nullable=False)

    # TaxJar rate fields
    combined_rate: Mapped[float] = mapped_column(Float, nullable=False)
    state_rate: Mapped[float] = mapped_column(Float, default=0.0)
    county_rate: Mapped[float] = mapped_column(Float, default=0.0)
    city_rate: Mapped[float] = mapped_column(Float, default=0.0)
    special_district_rate: Mapped[float] = mapped_column(Float, default=0.0)

    # Cache lifecycle
    cached_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
    expires_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
