"""Helpers para pasar entre PostGIS (Geography POINT) y lat/lng planos."""
from geoalchemy2.elements import WKTElement
from geoalchemy2.shape import to_shape

from app import models
from app.schemas.musician import (
    MediaItemOut,
    MusicianDetailOut,
    MusicianOut,
    MusicianSearchResult,
)


def point(lat: float, lng: float) -> WKTElement:
    """Construye un POINT PostGIS (nota: orden lon lat) desde lat/lng."""
    return WKTElement(f"POINT({lng} {lat})", srid=4326)


def coords(location) -> tuple[float | None, float | None]:
    """Devuelve (lat, lng) desde una columna Geography, o (None, None)."""
    if location is None:
        return None, None
    shape = to_shape(location)
    return shape.y, shape.x  # shapely usa (x=lon, y=lat)


def to_out(profile: models.MusicianProfile, distance_km: float | None = None) -> MusicianSearchResult:
    lat, lng = coords(profile.location)
    base = MusicianOut.model_validate(profile).model_dump()
    base["lat"] = lat
    base["lng"] = lng
    return MusicianSearchResult(**base, distance_km=distance_km)


def to_detail(profile: models.MusicianProfile) -> MusicianDetailOut:
    """Perfil completo con lat/lng y galería de media (para la pantalla pública)."""
    lat, lng = coords(profile.location)
    base = MusicianOut.model_validate(profile).model_dump()
    base["lat"] = lat
    base["lng"] = lng
    media = [MediaItemOut.model_validate(m) for m in profile.media]
    return MusicianDetailOut(**base, media=media)
