from pydantic import BaseModel, Field, model_validator


class ParserFieldCorrection(BaseModel):
    field_name: str
    extracted_value: str | None = None
    corrected_value: str | None = None


class SaveParserCorrectionsRequest(BaseModel):
    company_code: str | None = None
    fields: list[ParserFieldCorrection]
    notes: str | None = None


class ReExtractRequest(BaseModel):
    company_code: str | None = None
    apply_learned_patterns: bool = True


class PdfBbox(BaseModel):
    x0: float
    top: float
    x1: float
    bottom: float


class ResolveBboxRequest(BaseModel):
    page: int = Field(ge=1)
    bbox: PdfBbox


class SaveTrainingExampleRequest(BaseModel):
    field_name: str
    selection_start: int | None = Field(default=None, ge=0)
    selection_end: int | None = Field(default=None, ge=0)
    company_code: str | None = None
    page: int = Field(default=1, ge=1)
    notes: str | None = None
    bbox: PdfBbox | None = None

    @model_validator(mode="after")
    def require_selection_or_bbox(self):
        has_offsets = self.selection_start is not None and self.selection_end is not None
        if self.bbox is not None or has_offsets:
            return self
        raise ValueError("Provide selection_start/selection_end or bbox")


class SuggestPatternRequest(BaseModel):
    field_name: str | None = None
    value: str | None = None
    anchor_before: str | None = None
    anchor_after: str | None = None
    training_example_id: int | None = None


class TestPatternRequest(BaseModel):
    regex: str
    company_code: str
    field_name: str
    extraction_id: int | None = None


class SavePatternRequest(BaseModel):
    company_code: str
    field_name: str
    regex: str
    page_hint: int | None = None
    priority: int = 100
    source_training_example_id: int | None = None
    notes: str | None = None
    require_sample_pass: bool = True


PARSER_LAB_FIELD_DEFINITIONS: list[dict] = [
    {
        "title": "Customer",
        "fields": [
            {"key": "customer_name", "label": "Customer Name"},
            {"key": "mobile_number", "label": "Mobile Number"},
            {"key": "email_address", "label": "Email"},
            {"key": "nominee_name", "label": "Nominee Name"},
            {"key": "address", "label": "Address"},
            {"key": "city", "label": "City"},
            {"key": "state", "label": "State"},
            {"key": "pincode", "label": "Pincode"},
        ],
    },
    {
        "title": "Vehicle",
        "fields": [
            {"key": "vehicle_registration_number", "label": "Registration Number"},
            {"key": "engine_number", "label": "Engine Number"},
            {"key": "chassis_number", "label": "Chassis Number"},
            {"key": "vehicle_make", "label": "Make"},
            {"key": "vehicle_model", "label": "Model"},
            {"key": "vehicle_type", "label": "Vehicle Type"},
            {"key": "body_type", "label": "Body Type"},
            {"key": "fuel_type", "label": "Fuel Type"},
            {"key": "manufacturing_year", "label": "Manufacturing Year"},
        ],
    },
    {
        "title": "Policy",
        "fields": [
            {"key": "policy_number", "label": "Policy Number"},
            {"key": "policy_type", "label": "Policy Type"},
            {"key": "coverage_type", "label": "Coverage Type"},
            {"key": "policy_start_date", "label": "Start Date"},
            {"key": "policy_end_date", "label": "End Date"},
            {"key": "premium_amount", "label": "Premium Amount"},
            {"key": "idv", "label": "IDV"},
            {"key": "ncb", "label": "NCB"},
        ],
    },
]

KEY_PARSER_FIELDS = [
    "policy_number",
    "customer_name",
    "mobile_number",
    "policy_end_date",
    "vehicle_registration_number",
]
