from django.utils import timezone
from rest_framework import permissions, status
from rest_framework.parsers import FormParser, JSONParser, MultiPartParser
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.accounts.models import UserKYC
from apps.accounts.serializers_kyc import UserKYCSerializer


class UserKYCView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    parser_classes = [JSONParser, MultiPartParser, FormParser]

    def get(self, request):
        profile, _ = UserKYC.objects.get_or_create(user=request.user)
        serializer = UserKYCSerializer(profile, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)

    def post(self, request):
        return self.patch(request)

    def patch(self, request):
        profile, _ = UserKYC.objects.get_or_create(user=request.user)

        for field in ('pan_card_image', 'aadhaar_front_image', 'aadhaar_back_image', 'bank_proof_image'):
            uploaded_file = request.FILES.get(field)
            if uploaded_file:
                setattr(profile, field, uploaded_file)
                if field == 'pan_card_image':
                    profile.pan_status = UserKYC.DOC_STATUS_PENDING
                    profile.pan_review_note = ''
                elif field in ('aadhaar_front_image', 'aadhaar_back_image'):
                    profile.aadhaar_status = UserKYC.DOC_STATUS_PENDING
                    profile.aadhaar_review_note = ''
                elif field == 'bank_proof_image':
                    profile.bank_status = UserKYC.DOC_STATUS_PENDING
                    profile.bank_review_note = ''

        submit_for_review = str(request.data.get('submit_for_review', 'false')).lower() in ('1', 'true', 'yes')
        if submit_for_review:
            if not profile.has_all_required_documents:
                return Response(
                    {
                        'success': False,
                        'error': 'Please upload PAN, Aadhaar front, Aadhaar back, and bank passbook/cheque before submitting.',
                    },
                    status=status.HTTP_400_BAD_REQUEST,
                )
            if profile.pan_status != UserKYC.DOC_STATUS_APPROVED:
                profile.pan_status = UserKYC.DOC_STATUS_PENDING
            if profile.aadhaar_status != UserKYC.DOC_STATUS_APPROVED:
                profile.aadhaar_status = UserKYC.DOC_STATUS_PENDING
            if profile.bank_status != UserKYC.DOC_STATUS_APPROVED:
                profile.bank_status = UserKYC.DOC_STATUS_PENDING
            profile.overall_status = UserKYC.OVERALL_UNDER_REVIEW
            profile.submitted_at = timezone.now()

        profile.save()

        serializer = UserKYCSerializer(profile, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)
