from __future__ import annotations

from datetime import date, datetime

from pydantic import BaseModel, Field, field_validator


class NimitSevakReceiptRequest(BaseModel):
    form_no: str | None = None
    receipt_number: str | None = None
    applicant_name: str = Field(min_length=1)
    address: str = Field(min_length=1)
    aadhar_card_no: str = Field(min_length=1)
    mobile_no: str = Field(min_length=1)
    occupation: str | None = None
    age: str | None = None
    gender: str | None = None
    pradesh: str | None = None
    mandal_name: str | None = None
    reference_person_name: str | None = None
    reference_person_phone_no: str | None = None
    available_sevas: list[str] = Field(default_factory=list)
    other_seva_details: str | None = None
    seva_available_from: date | None = None
    seva_available_to: date | None = None
    available_vehicles: list[str] = Field(default_factory=list)
    drivable_vehicles: list[str] = Field(default_factory=list)
    vehicle_available_from: date | None = None
    vehicle_available_to: date | None = None
    night_shift_available: bool = False
    profile_photo_url: str | None = None
    photo_image_base64: str | None = None
    logo_image_base64: str | None = None

    @field_validator(
        "form_no",
        "receipt_number",
        "applicant_name",
        "address",
        "aadhar_card_no",
        "mobile_no",
        "occupation",
        "age",
        "gender",
        "pradesh",
        "mandal_name",
        "reference_person_name",
        "reference_person_phone_no",
        "other_seva_details",
        "profile_photo_url",
        mode="before",
    )
    @classmethod
    def strip_strings(cls, value: str | None):
        if isinstance(value, str):
            value = value.strip()
            return value or None
        return value

    @field_validator("available_sevas", "available_vehicles", "drivable_vehicles", mode="before")
    @classmethod
    def clean_lists(cls, value):
        if value is None:
            return []
        return [str(item).strip() for item in value if str(item).strip()]


class ReceiptResponse(BaseModel):
    success: bool = True
    receipt_number: str
    pdf_url: str
    storage_path: str
    generated_at: datetime
