from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response

from usuarios.models import DatosMedicos
from usuarios.permissions import is_admin, is_self_or_staff


from django.utils import timezone
from .models import DatosMedicos

def upsert_datos_medicos(id_user, data: dict):
    """
    id_user: instancia Usuarios o id (int)
    data: dict con campos permitidos de DatosMedicos
    """
    allowed = {
        "run",
        "prevision",
        "direccion",
        "contactoEmergencia",
        "lesiones",
        "enfermedades",
        "alergias",
    }
    defaults = {k: v for k, v in data.items() if k in allowed}

    obj, created = DatosMedicos.objects.update_or_create(
        idUser_id=getattr(id_user, "id", id_user),
        defaults=defaults,
    )
    return obj, created

@api_view(["PUT", "PATCH"])
@permission_classes([IsAuthenticated])
def datos_medicos_update(request, idUser):
    # Solo el propio usuario o un administrador pueden modificar la ficha médica
    if not (request.user.id == idUser or is_admin(request.user)):
        return Response({"message": "No tienes permisos para modificar estos datos"}, status=403)
    obj, created = upsert_datos_medicos(idUser, request.data)
    return Response({"ok": True, "created": created, "id": obj.id})

@api_view(["GET"])
@permission_classes([IsAuthenticated])
def datos_medicos_get_by_user_id(request, idUser: int):
    # Solo el propio usuario o el staff del club (admin/entrenador) pueden ver la ficha médica
    if not is_self_or_staff(request.user, idUser):
        return Response({"message": "No tienes permisos para ver estos datos"}, status=403)

    obj = DatosMedicos.objects.filter(idUser_id=idUser).first()
    if not obj:
        return Response({"message": "Datos médicos no encontrados"}, status=404)

    # Si tu modelo no tiene created_at/updated_at, quítalos del response.
    return Response(
        {
            "id": obj.id,
            "idUser": obj.idUser_id,
            "run": obj.run,
            "prevision": obj.prevision,
            "direccion": obj.direccion,
            "contactoEmergencia": obj.contactoEmergencia,
            "lesiones": obj.lesiones,
            "enfermedades": obj.enfermedades,
            "alergias": obj.alergias,
            **({"created_at": obj.created_at} if hasattr(obj, "created_at") else {}),
            **({"updated_at": obj.updated_at} if hasattr(obj, "updated_at") else {}),
        },
        status=200,
    )