from __future__ import annotations from datetime import datetime from typing import Any from pydantic import BaseModel, Field class CaseCreate(BaseModel): age: int | None = None gender: str | None = None health_flags: list[str] = Field(default_factory=list) elapsed_hours: int | None = None last_known_place: str | None = None direction: str | None = None terrain_primary: str | None = None weather: str | None = None resources: list[str] = Field(default_factory=list) gps: dict[str, float] | None = None notes: str | None = None note: str | None = None status: str = 'new' found_alive: bool | None = None found_distance_km: float | None = None found_direction: str | None = None found_location_type: str | None = None found_lat: float | None = None found_lon: float | None = None who_found: str | None = None mobile: bool = False class CaseUpdate(BaseModel): age: int | None = None gender: str | None = None health_flags: list[str] | None = None elapsed_hours: int | None = None last_known_place: str | None = None direction: str | None = None terrain_primary: str | None = None weather: str | None = None resources: list[str] | None = None gps_lat: float | None = None gps_lon: float | None = None notes: str | None = None note: str | None = None status: str | None = None found_alive: bool | None = None found_distance_km: float | None = None found_direction: str | None = None found_location_type: str | None = None found_lat: float | None = None found_lon: float | None = None who_found: str | None = None raw_text: str | None = None analysis_log: str | None = None class CaseResponse(BaseModel): id: str created_at: datetime updated_at: datetime age: int | None = None gender: str | None = None health_flags: list[str] elapsed_hours: int | None = None last_known_place: str | None = None direction: str | None = None terrain_primary: str | None = None weather: str | None = None resources: list[str] gps_lat: float | None = None gps_lon: float | None = None notes: str | None = None status: str found_alive: bool | None = None found_distance_km: float | None = None found_direction: str | None = None found_location_type: str | None = None found_lat: float | None = None found_lon: float | None = None who_found: str | None = None raw_text: str | None = None analysis_log: str | None = None result: dict[str, Any] | None = None class CaseListResponse(BaseModel): items: list[CaseResponse] total: int page: int page_size: int class DashboardResponse(BaseModel): total_cases: int found_alive_count: int found_deceased_count: int unknown_outcome_count: int median_found_distance_km: float | None recent_activity_count: int class RecommendationRequest(BaseModel): age: int | None = None gender: str | None = None health_flags: list[str] = Field(default_factory=list) elapsed_hours: int | None = None terrain_primary: str | None = None weather: str | None = None resources: list[str] = Field(default_factory=list) class AnalyzeResponse(BaseModel): urgency: str primary_zones: list[dict[str, Any]] immediate_actions: list[str] behavioral_prediction: str psychotype_recommendations: dict[str, Any] key_locations: list[str] case_id: str class ParseDocResponse(BaseModel): filename: str parsed: bool preview: dict[str, Any] raw_text: str | None = None