from decimal import Decimal
from datetime import datetime
from typing import Optional

from typing import Literal, Optional

from pydantic import BaseModel, Field


class PolicyMatchInfo(BaseModel):
    match_type: Literal["policy_number", "vehicle_registration"]
    existing_policy_id: int
    existing_policy_number: Optional[str] = None
    customer_name: Optional[str] = None
    vehicle_registration_number: Optional[str] = None
    policy_end_date: Optional[str] = None


class ExtractionListItem(BaseModel):
    id: int
    status: str
    original_filename: str
    insurance_company_id: Optional[int] = None
    insurance_company_name: Optional[str] = None
    customer_name: Optional[str] = None
    policy_number: Optional[str] = None
    vehicle_registration_number: Optional[str] = None
    policy_end_date: Optional[str] = None
    created_at: datetime
    is_new: bool = True
    policy_match: Optional[PolicyMatchInfo] = None


class ExtractionListResponse(BaseModel):
    items: list[ExtractionListItem]
    total: int
    page: int
    page_size: int
    new_count: int = 0
    existing_count: int = 0

class InspectPdfResponse(BaseModel):
    company_code: Optional[str] = None
    company_name: Optional[str] = None
    likely_policy: bool = False


class ConfirmExtractionRequest(BaseModel):
    customer_id: Optional[int] = None
    customer_name: str = Field(min_length=1)
    mobile_number: str = Field(min_length=10, max_length=20)
    email_address: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    pincode: Optional[str] = None
    nominee_name: Optional[str] = None

    vehicle_registration_number: Optional[str] = None
    engine_number: Optional[str] = None
    chassis_number: Optional[str] = None
    vehicle_make: Optional[str] = None
    vehicle_model: Optional[str] = None
    vehicle_type: Optional[str] = None
    body_type: Optional[str] = None
    fuel_type: Optional[str] = None
    manufacturing_year: Optional[int] = None

    insurance_company_id: Optional[int] = None
    policy_number: Optional[str] = None
    policy_type: Optional[str] = None
    coverage_type: Optional[str] = None
    policy_start_date: Optional[str] = None
    policy_end_date: Optional[str] = None
    premium_amount: Optional[Decimal] = None
    idv: Optional[Decimal] = None
    ncb: Optional[str] = None
    total_commission: Decimal = Decimal("0.00")
    notes: Optional[str] = None
