"""Request and response models for Remote Office Center APIs."""

from datetime import datetime

from pydantic import BaseModel, ConfigDict, Field


class AndroidDeviceRegistration(BaseModel):
    """Identity details supplied when an Android companion app registers."""

    model_config = ConfigDict(extra="forbid")

    device_name: str | None = None
    android_version: str | None = None
    manufacturer: str | None = None
    model: str | None = None
    serial_number: str | None = None


class PhoneHealthUpdate(AndroidDeviceRegistration):
    """Health, telemetry, and identity values an Android app can report."""

    battery: int | None = Field(default=None, ge=0, le=100)
    charging: bool | None = None
    # Retained for compatibility with Version 1 companion reports.
    wifi: bool | None = None
    wifi_name: str | None = None
    mobile_network: str | None = None
    tailscale_ip: str | None = None
    latitude: float | None = Field(default=None, ge=-90, le=90)
    longitude: float | None = Field(default=None, ge=-180, le=180)
    speed: float | None = Field(default=None, ge=0)
    altitude: float | None = None
    heading: float | None = Field(default=None, ge=0, le=360)
    accuracy: float | None = Field(default=None, ge=0)
    last_seen: datetime | None = None


class PhoneHealth(BaseModel):
    """The latest normalized health state for the Android phone."""

    device_name: str | None = None
    android_version: str | None = None
    manufacturer: str | None = None
    model: str | None = None
    serial_number: str | None = None
    battery: int | None = None
    charging: bool | None = None
    # Retained for compatibility with Version 1 companion responses.
    wifi: bool | None = None
    wifi_name: str | None = None
    mobile_network: str | None = None
    tailscale_ip: str | None = None
    latitude: float | None = None
    longitude: float | None = None
    speed: float | None = None
    altitude: float | None = None
    heading: float | None = None
    accuracy: float | None = None
    last_seen: datetime | None = None
