from pydantic import BaseModel, Field class IndustrialAVMRequest(BaseModel): """Request schema for industrial property rent estimation.""" province: str = Field(..., min_length=1, description="Province name (e.g. Bình Dương)") region: str = Field( ..., min_length=1, description="Region: south, north, central, mekong_delta" ) park_occupancy_rate: float = Field( ..., ge=0, le=1, description="Industrial park occupancy rate (0-1)" ) park_area_ha: float = Field(..., gt=0, description="Total park area in hectares") park_age_years: int = Field(..., ge=0, description="Industrial park age in years") distance_to_port_km: float = Field( ..., ge=0, description="Distance to nearest seaport in km" ) distance_to_airport_km: float = Field( ..., ge=0, description="Distance to nearest airport in km" ) distance_to_highway_km: float = Field( ..., ge=0, description="Distance to nearest highway in km" ) property_type: str = Field( ..., description="Industrial property type: warehouse, factory, ready_built_factory, " "ready_built_warehouse, open_yard, office_in_park", ) area_m2: float = Field(..., gt=0, description="Leasable area in m²") ceiling_height_m: float = Field( 0.0, ge=0, description="Ceiling/clear height in meters" ) floor_load_ton_m2: float = Field( 0.0, ge=0, description="Floor load capacity in tons/m²" ) power_capacity_kva: float = Field( 0.0, ge=0, description="Allocated power capacity in kVA" ) industry_demand_index: float = Field( 0.5, ge=0, le=1, description="Local industry demand index (0-1)" ) fdi_province_musd: float = Field( 0.0, ge=0, description="Province FDI inflow in million USD (trailing 12 months)" ) labor_cost_province_vnd: float = Field( 0.0, ge=0, description="Average province labor cost in VND/month" ) logistics_connectivity_score: float = Field( 0.5, ge=0, le=1, description="Logistics connectivity score (0-1)" ) class IndustrialComparable(BaseModel): """A comparable industrial property used for the estimation.""" park_name: str province: str property_type: str area_m2: float rent_usd_m2: float similarity_score: float = Field(..., ge=0, le=1) class FeatureImportance(BaseModel): """Feature importance from the model prediction.""" feature: str importance: float = Field(..., ge=0, le=1) class IndustrialAVMResponse(BaseModel): """Response schema for industrial property rent estimation.""" estimated_rent_usd_m2: float = Field( ..., description="Estimated monthly rent in USD per m²" ) confidence: float = Field( ..., ge=0, le=1, description="Prediction confidence score" ) rent_range_low_usd_m2: float = Field( ..., description="Lower bound rent estimate in USD/m²" ) rent_range_high_usd_m2: float = Field( ..., description="Upper bound rent estimate in USD/m²" ) annual_rent_usd_m2: float = Field( ..., description="Estimated annual rent in USD/m²" ) total_monthly_rent_usd: float = Field( ..., description="Total monthly rent for the requested area in USD" ) comparables: list[IndustrialComparable] = Field( default_factory=list, description="Similar industrial properties for reference" ) drivers: list[FeatureImportance] = Field( default_factory=list, description="Top feature drivers for this prediction", ) model_version: str = Field("heuristic-v1", description="Model version used")