from pydantic import BaseModel, ConfigDict, field_validator
from typing import Optional
from datetime import datetime


class RouteBase(BaseModel):
    origin_city: str
    destination_city: str
    distance_km: float
    estimated_duration_minutes: int
    is_active: bool


class RouteCreate(RouteBase):
    @field_validator("origin_city", "destination_city")
    @classmethod
    def validate_city_not_empty(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("City name cannot be empty")
        return v.strip()

    @field_validator("distance_km")
    @classmethod
    def validate_distance_positive(cls, v: float) -> float:
        if v <= 0:
            raise ValueError("Distance must be a positive number")
        return v

    @field_validator("estimated_duration_minutes")
    @classmethod
    def validate_duration_positive(cls, v: int) -> int:
        if v <= 0:
            raise ValueError("Estimated duration must be a positive number")
        return v


class RouteUpdate(BaseModel):
    origin_city: Optional[str] = None
    destination_city: Optional[str] = None
    distance_km: Optional[float] = None
    estimated_duration_minutes: Optional[int] = None
    is_active: Optional[bool] = None

    @field_validator("origin_city", "destination_city")
    @classmethod
    def validate_city_not_empty(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and (not v or not v.strip()):
            raise ValueError("City name cannot be empty")
        return v.strip() if v else v

    @field_validator("distance_km")
    @classmethod
    def validate_distance_positive(cls, v: Optional[float]) -> Optional[float]:
        if v is not None and v <= 0:
            raise ValueError("Distance must be a positive number")
        return v

    @field_validator("estimated_duration_minutes")
    @classmethod
    def validate_duration_positive(cls, v: Optional[int]) -> Optional[int]:
        if v is not None and v <= 0:
            raise ValueError("Estimated duration must be a positive number")
        return v


class RouteResponse(RouteBase):
    id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)