"""Devices domain - Pydantic schemas."""
from __future__ import annotations
from datetime import datetime
from typing import Any, Literal, Optional
from uuid import UUID

from pydantic import BaseModel


class PairStartRequest(BaseModel):
    name: Optional[str] = None
    hostname: Optional[str] = None
    os: Optional[str] = None
    os_version: Optional[str] = None
    app_version: Optional[str] = None


class PairStartResponse(BaseModel):
    device_id: UUID
    device_code: str
    user_code: str
    verification_uri: str
    expires_at: datetime


class PairPollResponse(BaseModel):
    status: Literal["pending", "approved", "already_paired", "expired", "revoked"]
    device_id: Optional[UUID] = None
    user_id: Optional[UUID] = None
    device_secret: Optional[str] = None


class PairApproveRequest(BaseModel):
    user_code: str


class PairPendingResponse(BaseModel):
    device_id: UUID
    user_code: str
    name: Optional[str] = None
    hostname: Optional[str] = None
    os: Optional[str] = None
    os_version: Optional[str] = None
    app_version: Optional[str] = None
    expires_at: Optional[datetime] = None


class DeviceResponse(BaseModel):
    id: UUID
    last_workspace_id: Optional[UUID] = None
    user_id: Optional[UUID] = None
    name: Optional[str] = None
    hostname: Optional[str] = None
    os: Optional[str] = None
    os_version: Optional[str] = None
    app_version: Optional[str] = None
    status: str
    capabilities: Optional[dict[str, Any]] = None
    last_heartbeat_at: Optional[datetime] = None
    last_seen_ip: Optional[str] = None
    paired_at: Optional[datetime] = None
    revoked_at: Optional[datetime] = None
    created_at: datetime

    model_config = {"from_attributes": True}


class HeartbeatRequest(BaseModel):
    capabilities: Optional[dict[str, Any]] = None
    active_run_ids: Optional[list[UUID]] = None
    timestamp: Optional[datetime] = None


class HeartbeatResponse(BaseModel):
    status: str
    server_time: datetime


class DeviceBootstrapResponse(BaseModel):
    device: DeviceResponse
    user: dict[str, Any]
    workspaces: list[dict[str, Any]]


class DeviceEventResponse(BaseModel):
    id: UUID
    device_id: UUID
    event_type: str
    triggered_by: str
    occurred_at: datetime
    metadata_json: Optional[dict[str, Any]] = None

    model_config = {"from_attributes": True}


class ClaimRunResponse(BaseModel):
    run_id: UUID
    project_id: UUID
    workspace_id: UUID
    run_grant: str
    run_grant_expires_in: int
    git: dict[str, Any]
    repo_path_hint: str
    callback_url: str
    progress_url: str
    source_bundle_url: str
    result_upload_url: str
    env: dict[str, str]
    payload_envelope: dict[str, Any]
    runner_source: str
