from django.contrib.auth import get_user_model
from rest_framework import generics, permissions, status, views
from rest_framework.response import Response

from accounts.permissions import IsAdmin
from accounts.serializers import AdminUserSerializer, RegisterSerializer, UserSerializer

User = get_user_model()


class RegisterView(generics.CreateAPIView):
    """Registo público — cria uma conta de estudante."""

    serializer_class = RegisterSerializer
    permission_classes = [permissions.AllowAny]


class SendOTPView(views.APIView):
    """Envia um código de 6 dígitos para o número de telefone fornecido."""

    permission_classes = [permissions.AllowAny]

    def post(self, request):
        phone = request.data.get("phone")
        if not phone:
            return Response({"error": "O número de telefone é obrigatório."}, status=status.HTTP_400_BAD_REQUEST)
        
        # Código demonstrativo/MVP
        code = "123456"
        return Response({
            "status": "success",
            "message": f"Código de 6 dígitos enviado para {phone}.",
            "demo_code": code,
        })


class VerifyOTPView(views.APIView):
    """Valida o código de 6 dígitos inserido."""

    permission_classes = [permissions.AllowAny]

    def post(self, request):
        phone = request.data.get("phone")
        code = request.data.get("code")
        if not phone or not code:
            return Response({"error": "Telefone e código são obrigatórios."}, status=status.HTTP_400_BAD_REQUEST)
        
        if len(str(code)) != 6:
            return Response({"error": "O código deve conter exatamente 6 dígitos."}, status=status.HTTP_400_BAD_REQUEST)

        return Response({
            "status": "success",
            "verified": True,
            "message": "Telefone verificado com sucesso.",
        })


class MeView(views.APIView):
    """Perfil do utilizador autenticado."""

    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        serializer = UserSerializer(request.user)
        return Response(serializer.data)


class UserListView(generics.ListCreateAPIView):
    """Gestão administrativa de utilizadores."""

    serializer_class = AdminUserSerializer
    permission_classes = [IsAdmin]
    search_fields = ["username", "email", "first_name", "last_name", "phone"]

    def get_queryset(self):
        return User.objects.all().order_by("-date_joined")


class UserDetailView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = AdminUserSerializer
    permission_classes = [IsAdmin]

    def get_queryset(self):
        return User.objects.all()

