"""Pydantic schemas for Hotspot."""

from datetime import datetime
from typing import Any, Optional

from pydantic import BaseModel, Field


HOTSPOT_TYPES = [
    "forward",
    "back",
    "door",
    "stairs_up",
    "stairs_down",
    "room_enter",
    "quick_jump",
    "info",
]

HOTSPOT_TYPE_PATTERN = "^(" + "|".join(HOTSPOT_TYPES) + ")$"

HOTSPOT_STATUSES = ["pending_review", "approved", "rejected"]
HOTSPOT_STATUS_PATTERN = "^(" + "|".join(HOTSPOT_STATUSES) + ")$"

HOTSPOT_CREATORS = ["ai", "human"]
HOTSPOT_CREATOR_PATTERN = "^(" + "|".join(HOTSPOT_CREATORS) + ")$"


class HotspotCreate(BaseModel):
    from_pano_id: str
    to_pano_id: Optional[str] = None
    yaw: float = Field(..., ge=0, le=360)
    pitch: float = Field(..., ge=-90, le=90)
    type: str = Field(..., pattern=HOTSPOT_TYPE_PATTERN)
    label: Optional[str] = Field(None, max_length=200)
    confidence: float = Field(default=1.0, ge=0, le=1)
    status: str = Field(default="pending_review", pattern=HOTSPOT_STATUS_PATTERN)
    created_by: str = Field(..., pattern=HOTSPOT_CREATOR_PATTERN)
    metadata: Optional[dict[str, Any]] = None


class HotspotUpdate(BaseModel):
    to_pano_id: Optional[str] = None
    yaw: Optional[float] = Field(None, ge=0, le=360)
    pitch: Optional[float] = Field(None, ge=-90, le=90)
    type: Optional[str] = Field(None, pattern=HOTSPOT_TYPE_PATTERN)
    label: Optional[str] = Field(None, max_length=200)
    confidence: Optional[float] = Field(None, ge=0, le=1)
    status: Optional[str] = Field(None, pattern=HOTSPOT_STATUS_PATTERN)
    metadata: Optional[dict[str, Any]] = None


class HotspotRead(BaseModel):
    id: str
    from_pano_id: str
    to_pano_id: Optional[str]
    yaw: float
    pitch: float
    type: str
    label: Optional[str]
    confidence: float
    status: str
    created_by: str
    metadata: Optional[Any]
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}


class HotspotBatchApprove(BaseModel):
    ids: list[str]
    status: str = Field(default="approved", pattern=HOTSPOT_STATUS_PATTERN)
