"""Typed contracts for the Internal Alpha Miner Detail overview.""" from datetime import datetime from typing import Literal from uuid import UUID from pydantic import BaseModel, Field from app.inventory.models import InventoryMinerDetail from app.locations.models import MinerLocationDetail OperationalState = Literal[ "online", "offline", "unknown", "unstable", "repair", "spare", "retired" ] class MinerDetailAccess(BaseModel): can_view_locations: bool = False can_read_repairs: bool = False can_view_repairs: bool = False can_read_components: bool = False class MinerDetailLocationSection(BaseModel): available: bool restricted: bool location: MinerLocationDetail | None = None class MinerDetailRepairEpisode(BaseModel): repair_id: UUID | None = None source: Literal["modular", "legacy"] active: bool status: str reason: str | None = None opened_at: datetime | None = None closed_at: datetime | None = None latest_context: str | None = None latest_context_at: datetime | None = None parts_count: int | None = None parts_summary: list[str] = Field(default_factory=list) class MinerDetailRepairSection(BaseModel): available: bool restricted: bool active_repair: MinerDetailRepairEpisode | None = None episodes: list[MinerDetailRepairEpisode] = Field(default_factory=list) class MinerDetailCapabilities(BaseModel): can_view_map: bool = False can_open_repair_center: bool = False can_read_repair_history: bool = False can_read_components: bool = False class MinerDetailOverviewData(BaseModel): miner: InventoryMinerDetail operational_state: OperationalState location: MinerDetailLocationSection repair: MinerDetailRepairSection capabilities: MinerDetailCapabilities class MinerDetailOverviewMeta(BaseModel): generated_at: datetime database_query_count: int = Field(ge=1, le=3) class MinerDetailOverviewResponse(BaseModel): data: MinerDetailOverviewData meta: MinerDetailOverviewMeta error: None = None