"""Schemas de perfil de músico, media y resultado de búsqueda."""
from pydantic import BaseModel, Field


class MusicianBase(BaseModel):
    stage_name: str = Field(min_length=2, max_length=120)
    bio: str | None = None
    show_description: str | None = None
    years_experience: int | None = None
    photo_url: str | None = None
    service_types: list[str] = []
    genres: list[str] = []
    base_price: float = 0
    currency: str = "USD"
    travel_radius_km: int = 20
    city: str | None = None
    country: str = "VE"


class MusicianUpsertIn(MusicianBase):
    """Crear o actualizar el perfil de músico del usuario autenticado."""
    pass


class LocationIn(BaseModel):
    lat: float = Field(ge=-90, le=90)
    lng: float = Field(ge=-180, le=180)
    is_available: bool | None = None


class VideoLinkIn(BaseModel):
    """Agregar un video al portfolio por link (YouTube/Instagram/TikTok/Vimeo)."""
    url: str = Field(min_length=8, max_length=600)
    caption: str | None = Field(default=None, max_length=200)
    is_featured: bool = False


class MediaItemOut(BaseModel):
    id: int
    kind: str          # photo | video
    url: str
    provider: str      # upload | youtube | instagram | tiktok | vimeo
    caption: str | None = None
    position: int
    is_featured: bool

    model_config = {"from_attributes": True}


class MusicianOut(MusicianBase):
    id: int
    rating: float
    reviews_count: int
    is_available: bool
    lat: float | None = None
    lng: float | None = None

    model_config = {"from_attributes": True}


class MusicianSearchResult(MusicianOut):
    """Perfil + distancia al punto de búsqueda (en km). Usado en la lista de búsqueda."""
    distance_km: float | None = None


class MusicianDetailOut(MusicianOut):
    """Perfil completo para la pantalla pública, incluye la galería de media."""
    media: list[MediaItemOut] = []
