from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated, AllowAny
from django.db import IntegrityError
from ..models import Customer
from .serializers import CustomerSerializer


class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

    def get_permissions(self):
        """
        Permissions personnalisées selon l'action :
        - Création : AllowAny (pour l'inscription)
        - Autres : IsAuthenticated
        """
        if self.action == "create":
            permission_classes = [AllowAny]
        else:
            permission_classes = [IsAuthenticated]
        return [permission() for permission in permission_classes]

    def create(self, request, *args, **kwargs):
        """Création d'un customer avec gestion des erreurs améliorée."""
        try:
            return super().create(request, *args, **kwargs)
        except IntegrityError as e:
            if "UNIQUE constraint failed: auth_user.email" in str(e):
                return Response(
                    {"error": "Un utilisateur avec cet email existe déjà."},
                    status=status.HTTP_400_BAD_REQUEST,
                )
            elif "UNIQUE constraint failed: customers_customer.user_id" in str(e):
                return Response(
                    {"error": "Cet utilisateur a déjà un profil client."},
                    status=status.HTTP_400_BAD_REQUEST,
                )
            return Response(
                {"error": "Erreur lors de la création du client."},
                status=status.HTTP_400_BAD_REQUEST,
            )
        except Exception as e:
            return Response(
                {"error": f"Erreur inattendue : {str(e)}"},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR,
            )

    @action(detail=True, methods=["post"], url_path="promote-to-member")
    def promote_to_member(self, request, pk=None):
        """Promouvoir un client au statut de membre."""
        customer = self.get_object()

        try:
            if customer.is_member:
                return Response(
                    {"error": "Ce client est déjà un membre."},
                    status=status.HTTP_400_BAD_REQUEST,
                )

            member = customer.promote_to_member(
                by_user=request.user,
                membership_start_date=request.data.get("membership_start_date"),
            )

            return Response(
                {
                    "message": "Client promu au statut de membre avec succès.",
                    "member_id": member.id,
                },
                status=status.HTTP_200_OK,
            )
        except ValueError as e:
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            return Response(
                {"error": f"Erreur lors de la promotion : {str(e)}"},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR,
            )
