from django.utils import timezone
from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.accounts.models import UserKYC
from apps.accounts.serializers_kyc import AdminUserKYCSerializer


class AdminKYCRequestListView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request):
        status_filter = (request.query_params.get('status') or '').strip().lower()
        queryset = UserKYC.objects.select_related('user').all().order_by('-updated_at')
        if status_filter:
            queryset = queryset.filter(overall_status=status_filter)

        serializer = AdminUserKYCSerializer(queryset, many=True, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)


class AdminKYCRequestDetailView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get_object(self, kyc_id):
        return UserKYC.objects.select_related('user').filter(id=kyc_id).first()

    def get(self, request, kyc_id):
        profile = self.get_object(kyc_id)
        if not profile:
            return Response({'success': False, 'error': 'KYC request not found.'}, status=status.HTTP_404_NOT_FOUND)

        serializer = AdminUserKYCSerializer(profile, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)

    def patch(self, request, kyc_id):
        profile = self.get_object(kyc_id)
        if not profile:
            return Response({'success': False, 'error': 'KYC request not found.'}, status=status.HTTP_404_NOT_FOUND)

        allowed_doc_statuses = {
            UserKYC.DOC_STATUS_PENDING,
            UserKYC.DOC_STATUS_APPROVED,
            UserKYC.DOC_STATUS_REJECTED,
        }

        for status_field in ('pan_status', 'aadhaar_status', 'bank_status'):
            if status_field in request.data:
                candidate = str(request.data.get(status_field) or '').strip().lower()
                if candidate not in allowed_doc_statuses:
                    return Response(
                        {'success': False, 'error': f'Invalid value for {status_field}.'},
                        status=status.HTTP_400_BAD_REQUEST,
                    )
                setattr(profile, status_field, candidate)

        for note_field in ('pan_review_note', 'aadhaar_review_note', 'bank_review_note'):
            if note_field in request.data:
                setattr(profile, note_field, str(request.data.get(note_field) or '').strip())

        if profile.pan_status == UserKYC.DOC_STATUS_APPROVED and not profile.pan_card_image:
            return Response({'success': False, 'error': 'PAN status cannot be approved without PAN document.'}, status=status.HTTP_400_BAD_REQUEST)
        if profile.aadhaar_status == UserKYC.DOC_STATUS_APPROVED and (not profile.aadhaar_front_image or not profile.aadhaar_back_image):
            return Response({'success': False, 'error': 'Aadhaar status cannot be approved without front and back images.'}, status=status.HTTP_400_BAD_REQUEST)
        if profile.bank_status == UserKYC.DOC_STATUS_APPROVED and not profile.bank_proof_image:
            return Response({'success': False, 'error': 'Bank status cannot be approved without passbook/cheque image.'}, status=status.HTTP_400_BAD_REQUEST)

        statuses = [profile.pan_status, profile.aadhaar_status, profile.bank_status]
        if all(s == UserKYC.DOC_STATUS_APPROVED for s in statuses):
            profile.overall_status = UserKYC.OVERALL_APPROVED
        elif any(s == UserKYC.DOC_STATUS_REJECTED for s in statuses):
            profile.overall_status = UserKYC.OVERALL_REJECTED
        elif all(s in (UserKYC.DOC_STATUS_PENDING, UserKYC.DOC_STATUS_APPROVED) for s in statuses):
            profile.overall_status = UserKYC.OVERALL_UNDER_REVIEW
        else:
            profile.overall_status = UserKYC.OVERALL_DRAFT

        profile.reviewed_by = request.user
        profile.reviewed_at = timezone.now()
        profile.save()

        serializer = AdminUserKYCSerializer(profile, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)
