from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel, Field from app.schemas.operations import VectorSelectionBBox class TemporalComparisonRequest(BaseModel): earlier_dataset_id: UUID later_dataset_id: UUID bbox: VectorSelectionBBox preview_limit: int = Field(default=500, ge=1, le=1000) class TemporalDatasetRef(BaseModel): id: UUID name: str observed_at: datetime source_version: str | None = None class TemporalMetricComparison(BaseModel): label: str unit: str aggregation_method: str earlier_value: float later_value: float absolute_change: float percent_change: float | None = None is_estimate: bool = False class TemporalObjectChanges(BaseModel): available: bool added_count: int | None = None removed_count: int | None = None modified_count: int | None = None unchanged_count: int | None = None class TemporalComparisonResponse(BaseModel): temporal_series_key: str earlier: TemporalDatasetRef later: TemporalDatasetRef selection_bbox: VectorSelectionBBox metric: TemporalMetricComparison object_changes: TemporalObjectChanges geojson: dict warnings: list[str] generated_at: datetime class TemporalSeriesDataset(BaseModel): id: UUID name: str observed_at: datetime source_version: str | None = None feature_count: int | None = None class TemporalSeriesRead(BaseModel): temporal_series_key: str source_name: str | None = None reference_layer_name: str | None = None dataset_count: int first_observed_at: datetime last_observed_at: datetime datasets: list[TemporalSeriesDataset]