from django.shortcuts import render
from rest_framework import viewsets, permissions, status
from .models import *
from .serializers import *
from login_signup.models import User
from setting.views import *
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView

# Create your views here.
class CMSViewSet(viewsets.ModelViewSet):
    serializer_class = CMSPageSerializer
    # permission_classes = [IsAuthenticated]

   
    def get_queryset(self):
        return CMS.objects.all()
        
    def get_permissions(self):
        if self.action == 'retrieve':
            return [AllowAny()]
        return [IsAuthenticated()]
    
    def create(self, request, *args, **kwargs):
        user = request.user
        slug = request.data.get('slug')
        if CMS.objects.filter(slug=slug).exists():
            return Response(
                {"status": False, "message": "Already have this Cms page.", "data": []},
                status=status.HTTP_400_BAD_REQUEST
            )
        
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(
                {"status": "success", "message": "CMS created successfully.", "data": serializer.data},
                status=status.HTTP_201_CREATED
            )
        return Response(
            {"status": "error", "message": "CMS creation failed.", "errors": serializer.errors},
            status=status.HTTP_400_BAD_REQUEST
        )


    def update(self, request, *args, **kwargs):

        instance = self.get_object()
        

        serializer = self.get_serializer(instance, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(
                {"status": "success", "message": "CMS updated successfully.", "data": serializer.data},
                status=status.HTTP_200_OK
            )
        return Response(
            {"status": "error", "message": "CMS update failed.", "errors": serializer.errors},
            status=status.HTTP_400_BAD_REQUEST
        )
        
    
    def retrieve(self, request, *args, **kwargs):
        slug = kwargs.get("pk")

        try:
            instance = CMS.objects.get(slug=slug)
        except CMS.DoesNotExist:
            return Response(
                {"status": False, "message": "CMS page not found."},
                status=status.HTTP_404_NOT_FOUND
            )

        serializer = self.get_serializer(instance)
        return Response({
            "status": True,
            "message": "CMS page retrieved successfully.",
            "data": serializer.data
        }, status=status.HTTP_200_OK)
    
class FAQViewSet(viewsets.ModelViewSet):
    serializer_class = FAQSerializer
   
    def get_queryset(self):
        return FAQ.objects.all()
        
    def get_permissions(self):
        if self.action == 'list':
            return [AllowAny()]
        return [IsAuthenticated()]
    
    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        page_param = request.query_params.get('page', None)

        if page_param:
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(
            {"status": "success", "message": "FAQs fetched successfully.", "data": serializer.data},
            status=status.HTTP_200_OK
        )
    

    def create(self, request, *args, **kwargs):
        question = request.data.get('question')

        if FAQ.objects.filter(question=question).exists():
            return Response(
                {"status": False, "message": "Already have this Faq question.", "data": []},
                status=status.HTTP_400_BAD_REQUEST
            )
        
        data = request.data.copy()
        data['is_active'] = True

        serializer = self.get_serializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(
                {"status": "success", "message": "FAQ created successfully.", "data": serializer.data},
                status=status.HTTP_201_CREATED
            )
        return Response(
            {"status": "error", "message": "FAQ creation failed.", "errors": serializer.errors},
            status=status.HTTP_400_BAD_REQUEST
        )


    def update(self, request, *args, **kwargs):
        faq_id = kwargs.get('pk')
        try:
            instance = self.get_queryset().get(id=faq_id)
        except FAQ.DoesNotExist:
            return Response(
                {"status": "error", "message": "FAQ not found."},
                status=status.HTTP_404_NOT_FOUND
            )
    
        question = request.data.get('question')
        
        if FAQ.objects.filter(question=question).exclude(id=faq_id).exists():
            return Response(
                {"status": False, "message": "Already have this Faq question.", "data": []},
                status=status.HTTP_400_BAD_REQUEST
            )

        serializer = self.get_serializer(instance, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(
                {"status": "success", "message": "FAQ updated successfully.", "data": serializer.data},
                status=status.HTTP_200_OK
            )
        return Response(
            {"status": "error", "message": "FAQ update failed.", "errors": serializer.errors},
            status=status.HTTP_400_BAD_REQUEST
        )
        
    
    def retrieve(self, request, *args, **kwargs):
        id = kwargs.get("pk")

        try:
            instance = FAQ.objects.get(id=id)
        except FAQ.DoesNotExist:
            return Response(
                {"status": False, "message": "FAQ not found."},
                status=status.HTTP_404_NOT_FOUND
            )

        serializer = self.get_serializer(instance)
        return Response({
            "status": True,
            "message": "FAQ retrieved successfully.",
            "data": serializer.data
        }, status=status.HTTP_200_OK)
    

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.soft_delete()
        return Response(
            {"status": "success", "message": "FAQ deleted successfully."},
            status=status.HTTP_204_NO_CONTENT
        )
    
class ReferralCMSAPIView(APIView):
    permission_classes = [IsAuthenticated]  

    def get(self, request, *args, **kwargs):
        user_id = request.user.id if request.user else None
        user = request.user

        if user_id:
            try:
                user = User.objects.get(id=user_id)
            except User.DoesNotExist:
                return Response({
                    "status": False,
                    "message": "User not found"
                }, status=404)

        # Fetch CMS content (assuming you use a CMSPage model)
        instance = CMS.objects.filter(slug='referral').first()

        serializer = CMSPageSerializer(instance)

        # Fetch referral point settings
        referrer_reward = int(get_setting_value('referrer_reward_points', 0))
        referred_reward = int(get_setting_value('referred_user_reward_points', 0))

        return Response({
            "status": True,
            "message": "Referral content fetched successfully",
            "data": {
                "referral_code": user.referral_code if user else None,
                "referrer_reward_points": referrer_reward,
                "referred_user_reward_points": referred_reward,
                "content": serializer.data
            }
        }, status=200)