"""Typed contracts for the read-only Mine Map.""" from datetime import datetime from uuid import UUID from pydantic import BaseModel class MapSite(BaseModel): id: UUID name: str class MapRoom(BaseModel): id: UUID site_id: UUID site_name: str name: str sort_order: int class MapActiveRepair(BaseModel): id: UUID status: str reason: str class MapPosition(BaseModel): location_position_id: UUID site_id: UUID | None = None site_name: str | None = None room_id: UUID | None = None room_name: str rack_name: str shelf_name: str shelf_index: int | None = None position_index: int position_label: str | None = None position_kind: str position_status: str occupied: bool expected_mac: str | None = None equipment_label: str | None = None notes: str | None = None source_file: str | None = None source_cell: str | None = None conflict_reason: str | None = None miner_id: UUID | None = None asset_id: str | None = None current_mac: str | None = None current_ip: str | None = None miner_status: str | None = None hostname: str | None = None miner_sn: str | None = None power_sn: str | None = None model: str | None = None miner_type: str | None = None firmware_version: str | None = None lifecycle_status: str | None = None last_seen_at: datetime | None = None asset_state: str | None = None observed_at: datetime | None = None hashrate_ths: float | None = None power_w: float | None = None chip_temp_max_c: float | None = None chip_temp_avg_c: float | None = None hash_stable: bool | None = None pool_rejected_percent: float | None = None active_repair: MapActiveRepair | None = None class MapVirtualMiner(BaseModel): miner_id: UUID | None = None site_id: UUID | None = None room_id: UUID | None = None asset_id: str | None = None asset_state: str current_mac: str | None = None current_ip: str | None = None miner_status: str | None = None status: str | None = None hostname: str | None = None miner_sn: str | None = None power_sn: str | None = None model: str | None = None miner_type: str | None = None firmware_version: str | None = None lifecycle_status: str | None = None last_seen_at: datetime | None = None observed_at: datetime | None = None hashrate_ths: float | None = None power_w: float | None = None chip_temp_max_c: float | None = None chip_temp_avg_c: float | None = None hash_stable: bool | None = None active_repair: MapActiveRepair | None = None class MineMapData(BaseModel): sites: list[MapSite] rooms: list[MapRoom] positions: list[MapPosition] virtual_miners: list[MapVirtualMiner] class MineMapMeta(BaseModel): generated_at: datetime site_id: UUID | None = None room_id: UUID | None = None position_count: int virtual_miner_count: int miner_details_included: bool class MineMapResponse(BaseModel): data: MineMapData meta: MineMapMeta error: None = None class MinerLocationDetail(BaseModel): site_id: UUID | None = None site_name: str | None = None room_id: UUID | None = None room_name: str | None = None position_id: UUID rack_label: str | None = None shelf_label: str | None = None position_label: str | None = None position_index: int | None = None class LocationSummary(BaseModel): sites: int rooms: int positions: int occupied_positions: int empty_positions: int mapped_miners: int | None = None unmapped_miners: int | None = None