"""
Vehicle Models
Vehicle categories and driver vehicle assignments
"""
from datetime import date
from typing import Optional, List
from sqlalchemy import String, Boolean, Integer, ForeignKey, Text, Date
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.models.base import BaseModel


class VehicleCategory(BaseModel):
    """
    Vehicle category configuration (e.g., Economy, Premium, SUV).
    Defines pricing and capacity for each category.
    """
    __tablename__ = "vehicle_categories"
    
    name: Mapped[str] = mapped_column(String(100), unique=True, nullable=False)
    display_name: Mapped[str] = mapped_column(String(100), nullable=False)
    description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    icon_url: Mapped[Optional[str]] = mapped_column(String(500), nullable=True)
    
    # Capacity
    min_passengers: Mapped[int] = mapped_column(Integer, default=1, nullable=False)
    max_passengers: Mapped[int] = mapped_column(Integer, default=4, nullable=False)
    max_luggage: Mapped[int] = mapped_column(Integer, default=2, nullable=False)
    
    # Pricing (in cents/paise)
    base_fare: Mapped[int] = mapped_column(Integer, default=5000, nullable=False)
    per_km_rate: Mapped[int] = mapped_column(Integer, default=1500, nullable=False)
    per_minute_rate: Mapped[int] = mapped_column(Integer, default=200, nullable=False)
    minimum_fare: Mapped[int] = mapped_column(Integer, default=5000, nullable=False)
    booking_fee: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
    
    # Multipliers
    surge_multiplier: Mapped[float] = mapped_column(default=1.0, nullable=False)
    night_multiplier: Mapped[float] = mapped_column(default=1.0, nullable=False)
    
    # Status
    is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
    sort_order: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
    
    # Relationships
    vehicles: Mapped[List["Vehicle"]] = relationship(
        "Vehicle",
        back_populates="category",
        lazy="dynamic"
    )


class Vehicle(BaseModel):
    """
    Driver's vehicle information.
    A driver can have multiple vehicles but only one active at a time.
    """
    __tablename__ = "vehicles"
    
    # Driver reference
    driver_id: Mapped[int] = mapped_column(
        ForeignKey("drivers.id", ondelete="CASCADE"),
        nullable=False,
        index=True
    )
    
    # Category reference
    category_id: Mapped[int] = mapped_column(
        ForeignKey("vehicle_categories.id", ondelete="RESTRICT"),
        nullable=False,
        index=True
    )
    
    # Vehicle Details
    make: Mapped[str] = mapped_column(String(100), nullable=False)
    model: Mapped[str] = mapped_column(String(100), nullable=False)
    year: Mapped[int] = mapped_column(Integer, nullable=False)
    color: Mapped[str] = mapped_column(String(50), nullable=False)
    
    # Registration
    license_plate: Mapped[str] = mapped_column(
        String(20),
        unique=True,
        nullable=False,
        index=True
    )
    registration_number: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    registration_expiry: Mapped[Optional[date]] = mapped_column(Date, nullable=True)
    
    # Insurance
    insurance_number: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    insurance_expiry: Mapped[Optional[date]] = mapped_column(Date, nullable=True)
    
    # Photos
    front_photo_url: Mapped[Optional[str]] = mapped_column(String(500), nullable=True)
    back_photo_url: Mapped[Optional[str]] = mapped_column(String(500), nullable=True)
    side_photo_url: Mapped[Optional[str]] = mapped_column(String(500), nullable=True)
    interior_photo_url: Mapped[Optional[str]] = mapped_column(String(500), nullable=True)
    
    # Status
    is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
    is_verified: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
    
    # Relationships
    driver: Mapped["Driver"] = relationship(
        "Driver",
        back_populates="vehicles",
        foreign_keys=[driver_id]
    )
    category: Mapped["VehicleCategory"] = relationship(
        "VehicleCategory",
        back_populates="vehicles"
    )
    
    @property
    def display_name(self) -> str:
        """Vehicle display name"""
        return f"{self.year} {self.make} {self.model}"


# Import for type hints
from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from app.models.driver import Driver
