import uuid
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class BodyTypeCreate(BaseModel):
    name: str
    is_active: bool = True


class BodyTypeUpdate(BaseModel):
    name: Optional[str] = None
    image_url: Optional[str] = None
    is_active: Optional[bool] = None


class BodyTypeOut(BaseModel):
    body_type_id: uuid.UUID
    name: str
    image_url: Optional[str] = None
    is_active: bool
    model_config = {"from_attributes": True}


class SegmentCreate(BaseModel):
    name: str
    is_active: bool = True


class SegmentUpdate(BaseModel):
    name: Optional[str] = None
    is_active: Optional[bool] = None


class SegmentOut(BaseModel):
    segment_id: uuid.UUID
    name: str
    is_active: bool
    model_config = {"from_attributes": True}


class RtoCreate(BaseModel):
    name: str
    description: Optional[str] = None
    is_active: bool = True


class RtoUpdate(BaseModel):
    name: Optional[str] = None
    description: Optional[str] = None
    is_active: Optional[bool] = None


class RtoOut(BaseModel):
    rto_id: uuid.UUID
    name: str
    description: Optional[str] = None
    is_active: bool
    model_config = {"from_attributes": True}


class ModelCreate(BaseModel):
    model_number: str
    image_url: Optional[str] = None
    is_active: bool = True
    model_config = {"protected_namespaces": ()}


class ModelUpdate(BaseModel):
    model_number: Optional[str] = None
    image_url: Optional[str] = None
    is_active: Optional[bool] = None
    model_config = {"protected_namespaces": ()}


class ModelOut(BaseModel):
    model_id: uuid.UUID
    model_number: str
    image_url: Optional[str]
    is_active: bool
    model_config = {"from_attributes": True, "protected_namespaces": ()}


class FeatureOptionCreate(BaseModel):
    option_value: str
    image_url: Optional[str] = None
    sequence_no: int = 0
    is_active: bool = True
    restricted_model_ids: Optional[List[str]] = None
    restricted_body_type_ids: Optional[List[str]] = None
    restricted_segment_ids: Optional[List[str]] = None
    restricted_combinations: Optional[List[dict]] = None


class FeatureOptionUpdate(BaseModel):
    option_value: Optional[str] = None
    image_url: Optional[str] = None
    sequence_no: Optional[int] = None
    is_active: Optional[bool] = None
    restricted_model_ids: Optional[List[str]] = None
    restricted_body_type_ids: Optional[List[str]] = None
    restricted_segment_ids: Optional[List[str]] = None
    restricted_combinations: Optional[List[dict]] = None


class FeatureOptionOut(BaseModel):
    option_id: uuid.UUID
    option_value: str
    image_url: Optional[str] = None
    sequence_no: int
    is_active: bool
    restricted_model_ids: Optional[List[str]] = None
    restricted_body_type_ids: Optional[List[str]] = None
    restricted_segment_ids: Optional[List[str]] = None
    restricted_combinations: Optional[List[dict]] = None
    model_config = {"from_attributes": True}


class FeatureCreate(BaseModel):
    section: str
    feature_name: str
    input_type: str = 'BOOLEAN'
    sequence_no: int = 0
    is_active: bool = True


class FeatureUpdate(BaseModel):
    section: Optional[str] = None
    feature_name: Optional[str] = None
    input_type: Optional[str] = None
    sequence_no: Optional[int] = None
    is_active: Optional[bool] = None


class FeatureOut(BaseModel):
    feature_id: uuid.UUID
    section: str
    feature_name: str
    input_type: str
    sequence_no: int
    is_active: bool
    options: List[FeatureOptionOut] = []
    model_config = {"from_attributes": True, "protected_namespaces": ()}


class ModelBodyTypeLink(BaseModel):
    model_id: uuid.UUID
    body_type_id: uuid.UUID
    model_config = {"protected_namespaces": ()}


class ModelBodyTypeOut(BaseModel):
    id: uuid.UUID
    model_id: uuid.UUID
    body_type_id: uuid.UUID
    model_config = {"from_attributes": True, "protected_namespaces": ()}


class ModelSegmentLink(BaseModel):
    model_id: uuid.UUID
    segment_id: uuid.UUID
    model_config = {"protected_namespaces": ()}


class ModelSegmentOut(BaseModel):
    id: uuid.UUID
    model_id: uuid.UUID
    segment_id: uuid.UUID
    model_config = {"from_attributes": True, "protected_namespaces": ()}

class FeatureSegmentOut(BaseModel):
    id: uuid.UUID
    feature_id: uuid.UUID
    segment_id: uuid.UUID
    model_config = {"from_attributes": True, "protected_namespaces": ()}


class FeatureSegmentAdd(BaseModel):
    feature_id: uuid.UUID
    segment_id: uuid.UUID


class SeatingLayoutCreate(BaseModel):
    layout_no: str
    chassis_model: str
    body_type: str
    segment: str
    door_type: str
    seat_type: str
    seating_type: str
    seating_capacity: str
    image_url: Optional[str] = None
    pdf_url: Optional[str] = None


class SeatingLayoutUpdate(BaseModel):
    layout_no: Optional[str] = None
    chassis_model: Optional[str] = None
    body_type: Optional[str] = None
    segment: Optional[str] = None
    door_type: Optional[str] = None
    seat_type: Optional[str] = None
    seating_type: Optional[str] = None
    seating_capacity: Optional[str] = None
    image_url: Optional[str] = None
    pdf_url: Optional[str] = None


class SeatingLayoutOut(BaseModel):
    layout_id: uuid.UUID
    layout_no: str
    chassis_model: str
    body_type: str
    segment: str
    door_type: str
    seat_type: str
    seating_type: str
    seating_capacity: str
    image_url: Optional[str] = None
    pdf_url: Optional[str] = None
    model_config = {"from_attributes": True}


class SeatModelConfigurationCreate(BaseModel):
    body_type_id: uuid.UUID
    seat_type: str
    layout_size: str
    seat_model_option_id: uuid.UUID
    supplier_option_id: uuid.UUID
    dimensions_option_id: uuid.UUID
    image_url: Optional[str] = None
    is_active: bool = True


class SeatModelConfigurationUpdate(BaseModel):
    body_type_id: Optional[uuid.UUID] = None
    seat_type: Optional[str] = None
    layout_size: Optional[str] = None
    seat_model_option_id: Optional[uuid.UUID] = None
    supplier_option_id: Optional[uuid.UUID] = None
    dimensions_option_id: Optional[uuid.UUID] = None
    image_url: Optional[str] = None
    is_active: Optional[bool] = None


class SeatModelConfigurationOut(BaseModel):
    id: uuid.UUID
    body_type_id: uuid.UUID
    seat_type: str
    layout_size: str
    seat_model_option_id: uuid.UUID
    supplier_option_id: uuid.UUID
    dimensions_option_id: uuid.UUID
    image_url: Optional[str] = None
    is_active: bool
    created_at: datetime
    model_config = {"from_attributes": True}
