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


class DealerLoginRequest(BaseModel):
    portal_username: str
    portal_password: str


class DealerLoginResponse(BaseModel):
    access_token: str
    token_type: str = "bearer"
    dealer_id: str
    dealer_name: str
    allow_chassis_tracking: bool = False

class ClientCreate(BaseModel):
    name: str
    contact_person: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None


class ClientUpdate(BaseModel):
    name: Optional[str] = None
    contact_person: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None


class ClientOut(BaseModel):
    client_id: str
    dealer_id: Optional[str] = None
    name: str
    contact_person: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    is_active: bool
    created_by_dealer: Optional[bool] = None
    created_at: datetime

    model_config = {"from_attributes": True}


class ClientSearchResult(BaseModel):
    client_id: str
    name: str

    model_config = {"from_attributes": True}


class ClientSearchResultWithDealer(BaseModel):
    client_id: str
    name: str
    dealer_id: Optional[str] = None
    dealer_name: Optional[str] = None

    model_config = {"from_attributes": True}


# ── Order masters (models/body-types/segments/RTOs/features + their relationships) ──

class ModelOut(BaseModel):
    model_id: uuid.UUID
    model_number: str
    model_config = {"from_attributes": True, "protected_namespaces": ()}


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


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


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


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


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


class ModelRelationPair(BaseModel):
    model_id: uuid.UUID
    related_id: uuid.UUID
    model_config = {"protected_namespaces": ()}


class FeatureRelationPair(BaseModel):
    feature_id: uuid.UUID
    segment_id: uuid.UUID
    model_config = {"protected_namespaces": ()}


class SeatConfigOut(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
    model_config = {"from_attributes": True}


class OrderMastersOut(BaseModel):
    models: List[ModelOut]
    body_types: List[BodyTypeOut]
    segments: List[SegmentOut]
    rto_list: List[RtoOut]
    features: List[FeatureOut]
    model_body_type_pairs: List[ModelRelationPair]
    model_segment_pairs: List[ModelRelationPair]
    feature_segment_pairs: List[FeatureRelationPair]
    seat_configs: List[SeatConfigOut]


# ── Orders ──

class VehicleFeatureInput(BaseModel):
    feature_id: uuid.UUID
    feature_option_id: Optional[uuid.UUID] = None
    bool_value: Optional[bool] = None
    text_value: Optional[str] = None
    image_url: Optional[str] = None


class ChassisInput(BaseModel):
    chassis_no: Optional[str] = None
    expected_delivery_date: Optional[date] = None


class VehicleLineInput(BaseModel):
    model_id: uuid.UUID
    body_type_id: uuid.UUID
    segment_id: uuid.UUID
    rto_id: Optional[uuid.UUID] = None
    qty: int = Field(1, ge=1)
    notes: Optional[str] = None
    is_edited: Optional[bool] = False
    edited_fields: Optional[List[str]] = None
    chassis: List[ChassisInput] = []
    features: List[VehicleFeatureInput] = []

    model_config = {"protected_namespaces": ()}


class OrderCreate(BaseModel):
    client_id: str
    remarks: Optional[str] = None
    rep_name: Optional[str] = None
    rep_contact: Optional[str] = None
    vehicles: List[VehicleLineInput] = Field(..., min_length=1)
    is_draft: bool = False


class OrderEditRequest(BaseModel):
    remarks: Optional[str] = None
    rep_name: Optional[str] = None
    rep_contact: Optional[str] = None
    vehicles: List[VehicleLineInput] = Field(..., min_length=1)
    is_draft: bool = False


class ChassisNumberOut(BaseModel):
    seq_no: int
    chassis_no: Optional[str] = None
    expected_delivery_date: Optional[date] = None
    
    model_config = {"from_attributes": True}


class VehicleFeatureOut(BaseModel):
    feature_id: uuid.UUID
    feature_option_id: Optional[uuid.UUID] = None
    bool_value: Optional[bool] = None
    text_value: Optional[str] = None
    image_url: Optional[str] = None
    model_config = {"from_attributes": True, "protected_namespaces": ()}


class VehicleLineOut(BaseModel):
    order_vehicle_id: uuid.UUID
    model_id: uuid.UUID
    model_name: Optional[str] = None
    body_type_id: uuid.UUID
    body_type_name: Optional[str] = None
    segment_id: uuid.UUID
    segment_name: Optional[str] = None
    rto_id: Optional[uuid.UUID] = None
    rto_name: Optional[str] = None
    qty: int
    notes: Optional[str] = None
    is_edited: bool = False
    edited_fields: Optional[List[str]] = None
    chassis: List[ChassisNumberOut] = []
    features: List[VehicleFeatureOut] = []

    model_config = {"from_attributes": True, "protected_namespaces": ()}


class OrderListItem(BaseModel):
    order_id: uuid.UUID
    order_no: str
    dealer_id: Optional[str] = None
    dealer_name: Optional[str] = None
    client_id: str
    client_name: Optional[str] = None
    status: str
    submitted_at: Optional[datetime] = None
    created_at: datetime
    chassis_nos: List[str] = []
    total_qty: int = 0
    allocated_qty: int = 0

    model_config = {"from_attributes": True}


class OrderActivityOut(BaseModel):
    action: str
    performed_by_dealer: bool
    notes: Optional[str] = None
    created_at: datetime

    model_config = {"from_attributes": True}


class OrderDetailOut(BaseModel):
    order_id: uuid.UUID
    order_no: str
    dealer_id: Optional[str] = None
    dealer_name: Optional[str] = None
    client_id: str
    client_name: Optional[str] = None
    status: str
    remarks: Optional[str] = None
    rep_name: Optional[str] = None
    rep_contact: Optional[str] = None
    billing_by: Optional[str] = None
    submitted_at: Optional[datetime] = None
    confirmed_at: Optional[datetime] = None
    created_at: datetime
    vehicles: List[VehicleLineOut] = []
    activity: List[OrderActivityOut] = []

    model_config = {"from_attributes": True}


class DealerRequestCreate(BaseModel):
    request_type: str
    details: str

class DealerRequestOut(BaseModel):
    request_id: uuid.UUID
    dealer_id: str
    dealer_name: Optional[str] = None
    request_type: str
    details: str
    photo_url: Optional[str] = None
    photo_urls: Optional[list[str]] = []
    status: str
    acknowledged_by: Optional[uuid.UUID] = None
    acknowledged_at: Optional[datetime] = None
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}


class ManufacturingDefectItem(BaseModel):
    item_no: int
    item_text: str
    authority_name: Optional[str] = None
    remarks: Optional[str] = None

    model_config = {"from_attributes": True}


class DealerChassisItem(BaseModel):
    chassis_id: uuid.UUID
    chassis_no: str
    dealer_id: Optional[str] = None
    client_name: Optional[str] = None
    model_id: Optional[uuid.UUID] = None
    model_name: Optional[str] = None
    fuel_type: str
    voltage: Optional[str] = None
    arrival_date: date
    da_lite_status: str
    da_lite_remarks: Optional[str] = None
    da_lite_photo_url: Optional[str] = None
    da_lite_checked_at: Optional[datetime] = None
    current_status: str
    tracking_status: str  # CHASSIS_IN / WIP / DISPATCHED
    dispatch_photo_url: Optional[str] = None
    dispatched_at: Optional[datetime] = None
    created_at: datetime
    order_id: Optional[uuid.UUID] = None
    order_no: Optional[str] = None
    order_status: Optional[str] = None
    is_allocated: bool = False
    # Manufacturing defects from thermal checksheet (visible to dealer)
    manufacturing_defects: List[ManufacturingDefectItem] = []

    model_config = {"from_attributes": True, "protected_namespaces": ()}


class DealerChassisListResponse(BaseModel):
    total: int
    chassis_in_count: int
    wip_count: int
    dispatched_count: int
    items: List[DealerChassisItem] = []
    allow_chassis_tracking: bool = False


# ── Templates ──

class VehicleTemplateCreate(BaseModel):
    name: str
    model_id: uuid.UUID
    body_type_id: uuid.UUID
    segment_id: uuid.UUID
    features: List[VehicleFeatureInput] = []

class VehicleTemplateOut(BaseModel):
    template_id: uuid.UUID
    name: str
    model_id: uuid.UUID
    body_type_id: uuid.UUID
    segment_id: uuid.UUID
    features: List[VehicleFeatureInput] = []
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True, "protected_namespaces": ()}

class DealerProfileUpdate(BaseModel):
    billing_address: Optional[str] = None
    shipping_address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    pincode: Optional[str] = None

class DealerContactCreate(BaseModel):
    name: str
    designation: Optional[str] = None
    email: Optional[str] = None
    phone: Optional[str] = None
    is_primary: Optional[bool] = False

class DealerContactUpdate(BaseModel):
    name: Optional[str] = None
    designation: Optional[str] = None
    email: Optional[str] = None
    phone: Optional[str] = None
    is_primary: Optional[bool] = None

class DealerContactOut(BaseModel):
    contact_id: str
    customer_id: str
    name: str
    designation: Optional[str] = None
    email: Optional[str] = None
    phone: Optional[str] = None
    is_primary: bool
    is_active: bool
    created_at: datetime
    
    model_config = {"from_attributes": True}

class DealerProfileOut(BaseModel):
    customer_id: str
    name: str
    type_code: Optional[str] = None
    gstin: Optional[str] = None
    pan: Optional[str] = None
    billing_address: Optional[str] = None
    shipping_address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    pincode: Optional[str] = None
    region: Optional[str] = None
    portal_enabled: bool
    created_at: datetime
    contacts: List[DealerContactOut] = []
    
    model_config = {"from_attributes": True}
