"""
Offer Profile Schemas
"""
from typing import Optional, List
from pydantic import BaseModel, Field
from app.models.offer_profile import PriceType


class OfferProfileBase(BaseModel):
    """Offer profile base fields"""
    name: str = Field(..., min_length=1, max_length=100)
    enabled: bool = True
    confirm_offer_manually: bool = True
    start_area: Optional[dict] = None
    destination_area: Optional[dict] = None
    distance_min_km: Optional[float] = Field(None, ge=0)
    distance_max_km: Optional[float] = Field(None, ge=0)
    price_type: PriceType = PriceType.PRICE_PER_KM
    price_per_km: Optional[int] = Field(None, ge=0)
    fixed_price: Optional[int] = Field(None, ge=0)
    initial_charge: Optional[int] = Field(None, ge=0)
    round_trip_enabled: bool = False
    round_trip_discount_pct: Optional[float] = Field(None, ge=0, le=100)
    child_seat_charge: Optional[int] = Field(None, ge=0)
    start_time: Optional[str] = Field(None, max_length=5)
    end_time: Optional[str] = Field(None, max_length=5)
    pre_ride_time_min: Optional[int] = Field(None, ge=0)
    min_lead_time_min: Optional[int] = Field(None, ge=0)
    days_of_week: Optional[List[int]] = Field(None)
    for_all_vehicles: bool = True
    vehicle_ids: Optional[List[int]] = None


class OfferProfileCreate(OfferProfileBase):
    """Create offer profile request"""
    pass


class OfferProfileUpdate(BaseModel):
    """Update offer profile request"""
    name: Optional[str] = Field(None, min_length=1, max_length=100)
    enabled: Optional[bool] = None
    confirm_offer_manually: Optional[bool] = None
    priority: Optional[int] = None
    start_area: Optional[dict] = None
    destination_area: Optional[dict] = None
    distance_min_km: Optional[float] = Field(None, ge=0)
    distance_max_km: Optional[float] = Field(None, ge=0)
    price_type: Optional[PriceType] = None
    price_per_km: Optional[int] = Field(None, ge=0)
    fixed_price: Optional[int] = Field(None, ge=0)
    initial_charge: Optional[int] = Field(None, ge=0)
    round_trip_enabled: Optional[bool] = None
    round_trip_discount_pct: Optional[float] = Field(None, ge=0, le=100)
    child_seat_charge: Optional[int] = Field(None, ge=0)
    start_time: Optional[str] = Field(None, max_length=5)
    end_time: Optional[str] = Field(None, max_length=5)
    pre_ride_time_min: Optional[int] = Field(None, ge=0)
    min_lead_time_min: Optional[int] = Field(None, ge=0)
    days_of_week: Optional[List[int]] = None
    for_all_vehicles: Optional[bool] = None
    vehicle_ids: Optional[List[int]] = None


class OfferProfileResponse(BaseModel):
    """Offer profile response"""
    id: int
    driver_id: int
    name: str
    enabled: bool
    confirm_offer_manually: bool
    priority: int
    start_area: Optional[dict] = None
    destination_area: Optional[dict] = None
    distance_min_km: Optional[float] = None
    distance_max_km: Optional[float] = None
    price_type: PriceType
    price_per_km: Optional[int] = None
    fixed_price: Optional[int] = None
    initial_charge: Optional[int] = None
    round_trip_enabled: bool
    round_trip_discount_pct: Optional[float] = None
    child_seat_charge: Optional[int] = None
    start_time: Optional[str] = None
    end_time: Optional[str] = None
    pre_ride_time_min: Optional[int] = None
    min_lead_time_min: Optional[int] = None
    days_of_week: Optional[List[int]] = None
    for_all_vehicles: bool
    vehicle_ids: Optional[List[int]] = None

    class Config:
        from_attributes = True


class OfferProfilePriorityUpdate(BaseModel):
    """Update offer profile priority order"""
    profile_ids: List[int] = Field(..., min_length=1)
