from datetime import datetime, timezone
from decimal import Decimal
from sqlalchemy import (
    String, DateTime, DECIMAL, Integer, Text,
    ForeignKey, JSON
)
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.database import Base


class MotornetValuation(Base):
    __tablename__ = "motornet_valuations"

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    valuation_id: Mapped[int] = mapped_column(Integer, ForeignKey("valuations.id"), nullable=False, index=True)
    plate: Mapped[str] = mapped_column(String(10), nullable=False, index=True)
    motornet_code: Mapped[str | None] = mapped_column(String(20))
    fetched_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
    )

    registration_year: Mapped[int | None] = mapped_column(Integer)
    registration_month: Mapped[int | None] = mapped_column(Integer)
    mileage: Mapped[int | None] = mapped_column(Integer)

    motornet_id: Mapped[int | None] = mapped_column(Integer)
    ediz_dati: Mapped[str | None] = mapped_column(String(20))
    brand_name: Mapped[str | None] = mapped_column(String(100))
    model_description: Mapped[str | None] = mapped_column(String(200))
    allestimento: Mapped[str | None] = mapped_column(String(255))
    alimentazione: Mapped[str | None] = mapped_column(String(100))
    immagine_url: Mapped[str | None] = mapped_column(String(500))
    xml_url: Mapped[str | None] = mapped_column(String(500))
    percorrenza_media_km: Mapped[int | None] = mapped_column(Integer)

    quotazione_blu: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    quotazione_blu_km: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    quotazione_giallo: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    quotazione_giallo_km: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    quotazione_blu_totale: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    quotazione_giallo_totale: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    variazione_km: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))

    prezzo_listino: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    prezzo_accessori: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    totale_riparazioni_carrozzeria: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))
    totale_riparazioni_meccanica: Mapped[Decimal | None] = mapped_column(DECIMAL(12, 2))

    raw_response: Mapped[dict | None] = mapped_column(JSON)

    valuation: Mapped["Valuation"] = relationship("Valuation", back_populates="motornet_valuations")
