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

class TransportMasterBase(BaseModel):
    transport_id: Optional[str] = None
    name: str
    contact_person: Optional[str] = None
    contact_number: Optional[str] = None
    vehicle_type: Optional[str] = None
    active: bool = True

class TransportMasterCreate(TransportMasterBase):
    pass

class TransportMasterResponse(TransportMasterBase):
    created_at: datetime
    class Config:
        from_attributes = True

class CustomerTypeMasterBase(BaseModel):
    type_code: str
    name: str
    is_active: bool = True

class CustomerTypeMasterResponse(CustomerTypeMasterBase):
    class Config:
        from_attributes = True

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

class CustomerContactCreate(CustomerContactBase):
    contact_id: Optional[str] = None

class CustomerContactResponse(CustomerContactBase):
    contact_id: str
    customer_id: str
    created_at: datetime
    updated_at: datetime
    class Config:
        from_attributes = True

class CustomerMasterBase(BaseModel):
    name: str
    type_code: str
    goodwill_reason: 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
    is_active: bool = True
    allow_chassis_tracking: bool = False

class CustomerMasterCreate(CustomerMasterBase):
    customer_id: Optional[str] = None
    contacts: List[CustomerContactCreate] = []

class CustomerMasterUpdate(BaseModel):
    name: Optional[str] = None
    type_code: Optional[str] = None
    goodwill_reason: 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
    is_active: Optional[bool] = None
    allow_chassis_tracking: Optional[bool] = None
    contacts: Optional[List[CustomerContactCreate]] = None

class CustomerMasterResponse(CustomerMasterBase):
    customer_id: str
    created_at: datetime
    updated_at: datetime
    customer_type: Optional[CustomerTypeMasterResponse] = None
    contacts: List[CustomerContactResponse] = []
    portal_enabled: bool = False
    portal_username: Optional[str] = None
    active_client_count: int = 0
    class Config:
        from_attributes = True

class SalesEnquiryBase(BaseModel):
    enquiry_number: Optional[str] = None
    customer_id: Optional[str] = None
    walk_in_name: Optional[str] = None
    walk_in_phone: Optional[str] = None
    enquiry_type: str
    enquiry_date: date
    requirements: Optional[str] = None
    source: Optional[str] = None
    assigned_to: Optional[UUID] = None
    status: str
    follow_up_date: Optional[date] = None
    remarks: Optional[str] = None

class SalesEnquiryCreate(SalesEnquiryBase):
    pass

class SalesEnquiryResponse(SalesEnquiryBase):
    enquiry_id: UUID
    created_at: datetime
    updated_at: datetime
    class Config:
        from_attributes = True















class SalesApprovalLogResponse(BaseModel):
    log_id: UUID
    order_id: UUID
    action: str
    reason: Optional[str]
    performed_by: Optional[UUID]
    performed_by_name: Optional[str]
    created_at: datetime
    class Config:
        from_attributes = True

class ClientMasterBase(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
    is_active: bool = True

class ClientMasterCreate(ClientMasterBase):
    client_id: Optional[str] = None
    dealer_ids: List[str] = []

class ClientMasterUpdate(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
    is_active: Optional[bool] = None
    dealer_ids: Optional[List[str]] = None

class ClientMasterResponse(ClientMasterBase):
    client_id: str
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None
    dealers: List[str] = [] # list of dealer_ids mapped to this client
    class Config:
        from_attributes = True

class ClientTrackingDashboardResponse(BaseModel):
    client_id: str
    name: str
    total_orders: int
    pending_orders: int
    completed_orders: int
    chassis_in_yard: int
    chassis_in_production: int
    chassis_dispatched: int

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

class DealerOrderConfigUpdate(BaseModel):
    model_id: UUID
    body_type_id: UUID
    segment_id: UUID
    features: List[SalesVehicleTemplateFeatureBase] = []

class SalesVehicleTemplateFeatureCreate(SalesVehicleTemplateFeatureBase):
    id: UUID
    template_id: UUID
    class Config:
        from_attributes = True

class SalesVehicleTemplateFeatureResponse(SalesVehicleTemplateFeatureBase):
    id: UUID
    template_id: UUID
    class Config:
        from_attributes = True

class SalesVehicleTemplateBase(BaseModel):
    name: str
    model_id: Optional[UUID] = None
    body_type_id: Optional[UUID] = None
    segment_id: Optional[UUID] = None

class SalesVehicleTemplateCreate(SalesVehicleTemplateBase):
    features: List[SalesVehicleTemplateFeatureBase] = []

class SalesVehicleTemplateUpdate(BaseModel):
    name: Optional[str] = None
    model_id: Optional[UUID] = None
    body_type_id: Optional[UUID] = None
    segment_id: Optional[UUID] = None
    features: Optional[List[SalesVehicleTemplateFeatureBase]] = None

class SalesVehicleTemplateResponse(SalesVehicleTemplateBase):
    template_id: UUID
    created_at: datetime
    updated_at: datetime
    features: List[SalesVehicleTemplateFeatureResponse] = []
    class Config:
        from_attributes = True

class DaLiteHoldLogResponse(BaseModel):
    log_id: UUID
    order_id: UUID
    action: str
    reason: str
    performed_by: UUID
    created_at: datetime
    class Config:
        from_attributes = True

class SalesActivityLogResponse(BaseModel):
    log_id: UUID
    entity_type: str
    entity_id: UUID
    activity_type: str
    old_value: Optional[str] = None
    new_value: Optional[str] = None
    remarks: Optional[str] = None
    performed_by: Optional[UUID] = None
    created_at: datetime
    class Config:
        from_attributes = True

class SparePartsOrderDetailCreate(BaseModel):
    rm_id: UUID
    qty: float
    unit_price: float
    line_amount: float

class SparePartsOrderDetailResponse(SparePartsOrderDetailCreate):
    detail_id: UUID
    order_id: UUID
    class Config:
        from_attributes = True

class SparePartsOrderCreate(BaseModel):
    order_number: Optional[str] = None
    customer_id: str
    status: str = 'PENDING'
    total_amount: float
    details: List[SparePartsOrderDetailCreate]

class SparePartsOrderResponse(BaseModel):
    order_id: UUID
    order_number: Optional[str] = None
    customer_id: str
    status: str
    total_amount: float
    created_at: datetime
    details: List[SparePartsOrderDetailResponse] = []
    class Config:
        from_attributes = True

class ServiceOrderCreate(BaseModel):
    customer_id: str
    chassis_no: Optional[str] = None
    service_type: str
    status: str = 'PENDING'
    notes: Optional[str] = None
    cost: float = 0.0

class ServiceOrderResponse(ServiceOrderCreate):
    service_id: UUID
    created_at: datetime
    class Config:
        from_attributes = True

class CustomerPaymentLogCreate(BaseModel):
    customer_id: str
    order_id: Optional[UUID] = None
    amount: float
    payment_mode: str
    reference_no: Optional[str] = None

class CustomerPaymentLogResponse(CustomerPaymentLogCreate):
    payment_id: UUID
    status: str
    recorded_by: UUID
    confirmed_by: Optional[UUID] = None
    created_at: datetime
    class Config:
        from_attributes = True

class GoodwillApprovalLogCreate(BaseModel):
    entity_type: str
    entity_id: UUID
    reason: str

class GoodwillApprovalLogResponse(GoodwillApprovalLogCreate):
    approval_id: UUID
    requested_by: UUID
    status: str
    manager_id: Optional[UUID] = None
    manager_notes: Optional[str] = None
    created_at: datetime
    class Config:
        from_attributes = True

class PaymentReceiptBase(BaseModel):
    customer_id: str
    order_id: Optional[UUID] = None
    amount: float
    payment_mode: str
    reference_no: Optional[str] = None

class PaymentReceiptCreate(PaymentReceiptBase):
    pass

class PaymentReceiptResponse(PaymentReceiptBase):
    payment_id: UUID
    status: str
    recorded_by: Optional[UUID] = None
    created_at: datetime
    updated_at: datetime
    class Config:
        from_attributes = True

# ─── Induction Ready Schemas ─────────────────────────────────────────

class InductionReadyChassisOut(BaseModel):
    chassis_id: UUID
    chassis_no: str
    order_id: Optional[UUID] = None
    order_no: Optional[str] = None
    order_vehicle_id: Optional[UUID] = None
    dealer_id: Optional[str] = None
    dealer_name: Optional[str] = None
    client_id: Optional[str] = None
    client_name: Optional[str] = None
    model_id: Optional[UUID] = None
    model_name: Optional[str] = None
    body_type_id: Optional[UUID] = None
    body_type_name: Optional[str] = None
    segment_id: Optional[UUID] = None
    segment_name: Optional[str] = None
    fuel_type: Optional[str] = None
    light_type: Optional[str] = None
    yard_location: Optional[str] = None
    procurement_status: Optional[str] = None
    arrival_date: Optional[date] = None
    days_in_yard: Optional[int] = 0
    da_lite_status: Optional[str] = None
    da_lite_photo_url: Optional[str] = None
    current_status: Optional[str] = None
    tracking_status: Optional[str] = None
    expected_delivery_date: Optional[date] = None
    order_status: Optional[str] = None
    order_qty: Optional[int] = 1
    scheduled_induction_date: Optional[date] = None
    scheduled_at: Optional[datetime] = None
    scheduled_by: Optional[UUID] = None
    scheduled_by_name: Optional[str] = None
    features_summary: Optional[str] = None
    remarks: Optional[str] = None
    class Config:
        from_attributes = True

class InductionReadySummaryOut(BaseModel):
    total_induction_ready: int
    total_dealers: int
    avg_yard_ageing_days: float
    da_lite_ok_count: int
    scheduled_today_count: int = 0
    scheduled_tomorrow_count: int = 0
    scheduled_upcoming_count: int = 0
    unscheduled_count: int = 0

class ScheduleInductionRequest(BaseModel):
    chassis_ids: List[UUID]
    scheduled_induction_date: Optional[date] = None
    notes: Optional[str] = None

class BatchScheduleDistributionItem(BaseModel):
    date: date
    count: int

class BatchAutoDistributeRequest(BaseModel):
    chassis_ids: Optional[List[UUID]] = None
    distributions: List[BatchScheduleDistributionItem]
    dealer_id: Optional[str] = None

class InductionDateBucket(BaseModel):
    date: date
    date_label: str
    count: int
    chassis_ids: List[UUID] = []

class SchedulePlanSummaryOut(BaseModel):
    today_count: int
    tomorrow_count: int
    upcoming_count: int
    unscheduled_count: int
    total_ready_count: int
    daily_breakdown: List[InductionDateBucket] = []

class InductToProductionRequest(BaseModel):
    chassis_ids: Optional[List[UUID]] = None
    scheduled_date: Optional[date] = None
    contractor_group: Optional[str] = None
    ac_make: Optional[str] = None
    interior_work: Optional[str] = None
    remarks: Optional[str] = None
    initial_station_id: Optional[UUID] = None

class InductToProductionResponse(BaseModel):
    success: bool
    inducted_count: int
    message: str

