"""
URL Configuration — Catálogo Web Dra. Mariela Moreno Autie
"""

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.http import JsonResponse
from django.shortcuts import render
from django.urls import include, path
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView


def home(request):
    """Landing page pública — Dra. Mariela Moreno Autie."""
    from apps.appointments.models import Servicio
    from apps.core.models import Galeria, GaleriaItem
    from apps.ratings.models import PromedioGlobal, Valoracion

    # Últimos 3 testimonios aprobados con comentario
    testimonios = (
        Valoracion.objects.filter(
            estado=Valoracion.Estado.APROBADA,
            is_active=True,
        )
        .exclude(comentario="")
        .select_related("paciente")
        .order_by("-created_at")[:3]
    )
    stats = PromedioGlobal.get_instance()

    # Servicios activos marcados para mostrar en home
    servicios = Servicio.objects.filter(
        is_active=True,
        mostrar_en_home=True,
    ).order_by("orden")

    # Galería activa — solo items que pertenecen a una galería activa
    galeria = GaleriaItem.objects.filter(
        is_active=True,
        mostrar_en_home=True,
        galeria__isnull=False,
        galeria__is_active=True,
        galeria__mostrar_en_home=True,
    ).select_related("galeria").order_by("orden")

    return render(request, "pages/home.html", {
        "testimonios": testimonios,
        "stats": stats,
        "servicios": servicios,
        "galeria": galeria,
    })


def api_servicio_detalle(request, servicio_id):
    """Endpoint público — devuelve las especialidades de un servicio."""
    from apps.appointments.models import Servicio
    from apps.finance.models import Cirugia, ControlPrenatal, Imagen, Laboratorio, Proceder, ServicioMedico

    try:
        servicio = Servicio.objects.get(pk=servicio_id, is_active=True)
    except Servicio.DoesNotExist:
        return JsonResponse({"error": "Servicio no encontrado"}, status=404)

    especialidades = []
    for Modelo in [ServicioMedico, Laboratorio, Imagen, Proceder, Cirugia, ControlPrenatal]:
        items = Modelo.objects.filter(
            servicio_padre=servicio, is_active=True
        ).values("nombre", "descripcion")
        for item in items:
            especialidades.append({
                "nombre": item["nombre"],
                "descripcion": item["descripcion"] or "",
            })

    especialidades.sort(key=lambda x: x["nombre"])

    return JsonResponse({
        "servicio": {
            "nombre": servicio.nombre,
            "descripcion": servicio.descripcion,
            "icono_svg": servicio.icono_svg,
        },
        "especialidades": especialidades,
        "total": len(especialidades),
    })


urlpatterns = [
    path("", home, name="home"),
    path("api/servicios/<uuid:servicio_id>/", api_servicio_detalle, name="api_servicio_detalle"),
    path("gestao-interna/", admin.site.urls),
    path("cuenta/", include("apps.users.urls", namespace="users")),
    path("citas/", include("apps.appointments.urls", namespace="appointments")),
    path("finanzas/", include("apps.finance.urls", namespace="finance")),
    path("reportes/", include("apps.reports.urls", namespace="reports")),
    path("api/v1/notifications/", include("apps.notifications.urls", namespace="notifications")),
    path("dashboard/", include("apps.dashboard.urls", namespace="dashboard")),
    path("valoraciones/", include("apps.ratings.urls", namespace="ratings")),

    # ── API REST v1 ───────────────────────────────────────
    path("api/v1/", include("apps.api.urls", namespace="api")),
]

# Swagger/OpenAPI solo en desarrollo
if settings.DEBUG:
    urlpatterns += [
        path("api/schema/", SpectacularAPIView.as_view(), name="schema"),
        path("api/docs/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger-ui"),
    ]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
