from rest_framework import serializers

from apps.accounts.models import UserKYC


class UserKYCSerializer(serializers.ModelSerializer):
    pan_card_image_url = serializers.SerializerMethodField()
    aadhaar_front_image_url = serializers.SerializerMethodField()
    aadhaar_back_image_url = serializers.SerializerMethodField()
    bank_proof_image_url = serializers.SerializerMethodField()
    has_all_required_documents = serializers.ReadOnlyField()

    class Meta:
        model = UserKYC
        fields = [
            'id',
            'user',
            'overall_status',
            'submitted_at',
            'reviewed_at',
            'pan_status',
            'aadhaar_status',
            'bank_status',
            'pan_review_note',
            'aadhaar_review_note',
            'bank_review_note',
            'pan_card_image',
            'aadhaar_front_image',
            'aadhaar_back_image',
            'bank_proof_image',
            'pan_card_image_url',
            'aadhaar_front_image_url',
            'aadhaar_back_image_url',
            'bank_proof_image_url',
            'has_all_required_documents',
            'created_at',
            'updated_at',
        ]
        read_only_fields = [
            'id',
            'user',
            'overall_status',
            'submitted_at',
            'reviewed_at',
            'pan_status',
            'aadhaar_status',
            'bank_status',
            'pan_review_note',
            'aadhaar_review_note',
            'bank_review_note',
            'pan_card_image_url',
            'aadhaar_front_image_url',
            'aadhaar_back_image_url',
            'bank_proof_image_url',
            'has_all_required_documents',
            'created_at',
            'updated_at',
        ]

    def _build_file_url(self, file_field):
        request = self.context.get('request') if hasattr(self, 'context') else None
        if not file_field or not getattr(file_field, 'name', None):
            return None
        try:
            url = file_field.url
            return request.build_absolute_uri(url) if request else url
        except Exception:
            return None

    def get_pan_card_image_url(self, obj):
        return self._build_file_url(obj.pan_card_image)

    def get_aadhaar_front_image_url(self, obj):
        return self._build_file_url(obj.aadhaar_front_image)

    def get_aadhaar_back_image_url(self, obj):
        return self._build_file_url(obj.aadhaar_back_image)

    def get_bank_proof_image_url(self, obj):
        return self._build_file_url(obj.bank_proof_image)


class AdminUserKYCSerializer(UserKYCSerializer):
    user_name = serializers.SerializerMethodField()
    user_mobile = serializers.SerializerMethodField()
    user_email = serializers.SerializerMethodField()

    class Meta(UserKYCSerializer.Meta):
        fields = UserKYCSerializer.Meta.fields + ['user_name', 'user_mobile', 'user_email']

    def get_user_name(self, obj):
        return f"{obj.user.first_name} {obj.user.last_name}".strip() or str(obj.user.id)

    def get_user_mobile(self, obj):
        return obj.user.mobile

    def get_user_email(self, obj):
        return obj.user.email
