from __future__ import annotations from uuid import UUID from pydantic import BaseModel from .operations import VectorSelectionBBox class ThematicRasterAcquireRequest(BaseModel): bbox: VectorSelectionBBox area_id: UUID | None = None product_key: str force_refresh: bool = False class ThematicRasterProductRead(BaseModel): key: str display_name: str theme: str metric_kind: str coverage_id: str native_resolution_m: float source_crs: str source_value_unit: str observation_year: int source_version: str catalog_url: str attribution: str license_note: str legend_min_label: str legend_max_label: str included_source_values: list[int] limitation_message: str class ThematicRasterAcquisitionResult(BaseModel): output_dataset_id: UUID reused: bool provider: str product_key: str display_name: str theme: str metric_kind: str coverage_id: str resolution_m: float width: int height: int valid_pixel_count: int bbox_epsg4326: list[float] bbox_epsg31370: list[float] observation_year: int source_value_unit: str attribution: str limitation_message: str class ThematicRasterSelectionRequest(BaseModel): bbox: VectorSelectionBBox area_id: UUID | None = None class ThematicRasterMetric(BaseModel): metric_key: str metric_label: str metric_value: float metric_unit: str aggregation_method: str derived: bool = True is_estimate: bool = True class ThematicRasterSelectionSummary(BaseModel): metric_label: str metric_value: float metric_unit: str aggregation_method: str primary_metric_key: str metrics: list[ThematicRasterMetric] class ThematicRasterSelectionResponse(BaseModel): dataset_id: UUID product_key: str theme: str metric_kind: str selection_bbox: VectorSelectionBBox selection_area_id: UUID | None = None selected_cell_count: int valid_cell_count: int coverage_ratio: float resolution_m: float observation_year: int summary: ThematicRasterSelectionSummary unsupported_metrics: list[str] limitation_message: str generated_at: str