from __future__ import annotations from pydantic import Field from .common import ApiEnvelope, JsonObject, RouteContract, SchemaModel HTTP_METHOD = 'GET' ROUTE_PATH = '/api/farm-data//detail/' class FarmDetailRequest(SchemaModel): farm_uuid: str class FarmCenterLocationSchema(SchemaModel): id: int lat: float lon: float farm_boundary: JsonObject = Field(default_factory=dict) class WeatherForecastDetailSchema(SchemaModel): id: int forecast_date: str | None = None temperature_min: float | None = None temperature_max: float | None = None temperature_mean: float | None = None precipitation: float | None = None precipitation_probability: float | None = None humidity_mean: float | None = None wind_speed_max: float | None = None et0: float | None = None weather_code: int | None = None class FarmSoilDepthSchema(SchemaModel): depth_label: str bdod: float | None = None cec: float | None = None cfvo: float | None = None clay: float | None = None nitrogen: float | None = None ocd: float | None = None ocs: float | None = None phh2o: float | None = None sand: float | None = None silt: float | None = None soc: float | None = None wv0010: float | None = None wv0033: float | None = None wv1500: float | None = None class FarmSoilPayloadSchema(SchemaModel): resolved_metrics: JsonObject = Field(default_factory=dict) metric_sources: JsonObject = Field(default_factory=dict) depths: list[FarmSoilDepthSchema] = Field(default_factory=list) class FarmPlantSchema(SchemaModel): id: int name: str light: str | None = None watering: str | None = None soil: str | None = None temperature: str | None = None growth_stage: str | None = None planting_season: str | None = None harvest_time: str | None = None spacing: str | None = None fertilizer: str | None = None created_at: str | None = None updated_at: str | None = None class FarmIrrigationMethodSchema(SchemaModel): id: int name: str category: str | None = None description: str | None = None water_efficiency_percent: float | None = None water_pressure_required: str | None = None flow_rate: str | None = None coverage_area: str | None = None soil_type: str | None = None climate_suitability: str | None = None created_at: str | None = None updated_at: str | None = None class FarmDetailResponseData(SchemaModel): center_location: FarmCenterLocationSchema weather: WeatherForecastDetailSchema | None = None sensor_payload: JsonObject = Field(default_factory=dict) soil: FarmSoilPayloadSchema plant_ids: list[int] = Field(default_factory=list) plants: list[FarmPlantSchema] = Field(default_factory=list) irrigation_method_id: int | None = None irrigation_method: FarmIrrigationMethodSchema | None = None created_at: str | None = None updated_at: str | None = None class FarmDetailResponse(ApiEnvelope[FarmDetailResponseData]): pass CONTRACT = RouteContract( method=HTTP_METHOD, path=ROUTE_PATH, request_model=FarmDetailRequest.__name__, response_model=FarmDetailResponse.__name__, )