# app/modules/chassis_tracker/schemas.py
from pydantic import BaseModel
from typing import List, Optional, Dict, Any
from uuid import UUID
from datetime import datetime, date


class ChassisSearchResult(BaseModel):
    model_config = {'protected_namespaces': ()}

    chassis_id: UUID
    chassis_no: str
    model_name: Optional[str] = None
    model_code: Optional[str] = None
    dealer_name: Optional[str] = None
    client_name: Optional[str] = None
    current_status: str
    tracking_status: str
    current_station_name: Optional[str] = None
    progress_percent: int = 0
    arrival_date: Optional[date] = None


class TimelineMilestone(BaseModel):
    stage_id: str
    stage_name: str
    status: str  # COMPLETED / IN_PROGRESS / PENDING / ON_HOLD
    timestamp: Optional[datetime] = None
    summary: str
    details: Dict[str, Any] = {}


class StationVisitLog(BaseModel):
    station_id: UUID
    station_code: str
    station_name: str
    sequence_no: Optional[int] = None
    status: str  # COMPLETED / AT_STATION / PENDING
    arrival_time: Optional[datetime] = None
    completion_time: Optional[datetime] = None
    scanned_by_name: Optional[str] = None
    elapsed_minutes: Optional[int] = None
    standard_cycle_time_min: Optional[int] = None
    is_overdue: bool = False
    delay_reason: Optional[str] = None
    delay_remarks: Optional[str] = None
    qa_status: Optional[str] = None
    qa_passed_count: Optional[int] = None
    qa_total_count: Optional[int] = None


class ClientUpdateMessages(BaseModel):
    whatsapp_text: str
    email_subject: str
    email_body: str
    sms_text: str


class SpecialFeatureItemOut(BaseModel):
    model_config = {'protected_namespaces': ()}
    feature_id: UUID
    feature_name: str
    section: str
    input_type: str  # BOOLEAN / DROPDOWN / TEXT
    sequence_no: int = 0
    option_id: Optional[UUID] = None
    option_value: Optional[str] = None
    bool_value: Optional[bool] = None
    text_value: Optional[str] = None
    display_value: str
    image_url: Optional[str] = None


class SpecialFeatureSectionOut(BaseModel):
    model_config = {'protected_namespaces': ()}
    section: str
    count: int = 0
    items: List[SpecialFeatureItemOut] = []


class BomMaterialItemOut(BaseModel):
    model_config = {'protected_namespaces': ()}
    rm_id: Optional[UUID] = None
    item_code: Optional[str] = None
    material_name: str
    quantity: float
    uom: Optional[str] = None


class ChassisOrderSpecOut(BaseModel):
    model_config = {'protected_namespaces': ()}
    has_order: bool = False
    chassis_id: UUID
    chassis_no: str

    # Order details
    order_id: Optional[UUID] = None
    order_no: Optional[str] = None
    order_date: Optional[datetime] = None
    confirmed_date: Optional[datetime] = None
    expected_delivery_date: Optional[date] = None
    dealer_id: Optional[str] = None
    dealer_name: Optional[str] = None
    dealer_city: Optional[str] = None
    dealer_phone: Optional[str] = None
    client_id: Optional[str] = None
    client_name: Optional[str] = None
    client_phone: Optional[str] = None
    client_city: Optional[str] = None
    client_address: Optional[str] = None
    rep_name: Optional[str] = None
    rep_contact: Optional[str] = None
    billing_by: Optional[str] = None
    order_status: Optional[str] = None
    order_remarks: Optional[str] = None
    vehicle_notes: Optional[str] = None
    order_quantity: int = 1

    # What needs to be manufactured (Vehicle Build Scope)
    model_number: Optional[str] = None
    body_type_name: Optional[str] = None
    segment_name: Optional[str] = None
    rto_name: Optional[str] = None
    rto_description: Optional[str] = None
    fuel_type: str = 'DIESEL'
    voltage: Optional[str] = None
    light_type: Optional[str] = None
    fuel_receiving_qty: Optional[float] = None
    yard_location: Optional[str] = None
    source_type: Optional[str] = None
    current_station_name: Optional[str] = None

    # Special Features
    special_features_sections: List[SpecialFeatureSectionOut] = []
    total_special_features_count: int = 0

    # Bill of Materials
    bom_number: Optional[str] = None
    product_name: Optional[str] = None
    bom_materials: List[BomMaterialItemOut] = []


class ChassisLifecycleResponse(BaseModel):
    chassis_id: UUID
    chassis_no: str
    model: Dict[str, Any]
    customer: Dict[str, Any]
    yard: Dict[str, Any]
    store: Dict[str, Any]
    current_state: Dict[str, Any]
    production_stations: List[StationVisitLog] = []
    production_holds: List[Dict[str, Any]] = []
    qa_inspections: List[Dict[str, Any]] = []
    fvi_testing: Optional[Dict[str, Any]] = None
    dispatch: Optional[Dict[str, Any]] = None
    timeline: List[TimelineMilestone] = []
    client_messages: ClientUpdateMessages
    order_spec: Optional[ChassisOrderSpecOut] = None

