from __future__ import annotations from uuid import UUID from pydantic import BaseModel, Field from .operations import VectorSelectionBBox class FloodHazardAcquireRequest(BaseModel): bbox: VectorSelectionBBox area_id: UUID | None = None product_key: str = "pluviaal_current_t100" resolution_m: float | None = Field(default=None, ge=2.0, le=20.0) force_refresh: bool = False class FloodHazardProductRead(BaseModel): key: str display_name: str mechanism: str climate_context: str probability_class: str return_period_years: int coverage_id: str native_resolution_m: float source_crs: str source_value_unit: str normalized_value_unit: str published_on: str catalog_url: str attribution: str limitation_message: str class FloodHazardAcquisitionResult(BaseModel): output_dataset_id: UUID reused: bool provider: str product_key: str display_name: str mechanism: str climate_context: str probability_class: str return_period_years: int coverage_id: str resolution_m: float width: int height: int inundated_pixel_count: int bbox_epsg4326: list[float] bbox_epsg31370: list[float] attribution: str limitation_message: str class FloodHazardSelectionRequest(BaseModel): bbox: VectorSelectionBBox area_id: UUID | None = None class FloodHazardPartitionSelectionRequest(FloodHazardSelectionRequest): product_key: str = "pluviaal_current_t100" dataset_ids: list[UUID] | None = Field(default=None, min_length=1, max_length=4096) class FloodHazardMetric(BaseModel): metric_key: str metric_label: str metric_value: float metric_unit: str aggregation_method: str derived: bool = True class FloodHazardSelectionSummary(BaseModel): metric_label: str metric_value: float metric_unit: str aggregation_method: str primary_metric_key: str metrics: list[FloodHazardMetric] class FloodHazardSelectionResponse(BaseModel): dataset_id: UUID dataset_ids: list[UUID] = Field(default_factory=list) partition_count: int = Field(default=1, ge=1) product_key: str mechanism: str climate_context: str probability_class: str return_period_years: int selection_bbox: VectorSelectionBBox selection_area_id: UUID | None = None # Three populations kept apart: cells drawn, cells the model covers, and # cells with a positive modelled depth. ``inundated_fraction`` is a share # of the modelled cells, and is null when nothing was modelled — absence # of a model is not evidence of zero risk. selected_cell_count: int valid_cell_count: int = 0 no_data_cell_count: int = 0 data_coverage_ratio: float = 1.0 inundated_cell_count: int inundated_fraction: float | None = None coverage_warning: str | None = None resolution_m: float summary: FloodHazardSelectionSummary unsupported_metrics: list[str] limitation_message: str generated_at: str