from rest_framework import serializers
from .models import QRConfig, Branch


class QRConfigSerializer(serializers.ModelSerializer):
    qr_image_url = serializers.SerializerMethodField()

    class Meta:
        model = QRConfig
        fields = [
            'id',
            'qr_image',
            'qr_image_url',
            'company_name',
            'is_active',
            'enable_qr_scan',
            'enable_bank_transfer',
            'enable_phonepe',
            'enable_razorpay',
            'bank_account_holder_name',
            'bank_account_number',
            'bank_name',
            'bank_ifsc_code',
            'bank_branch_name',
            'upi_id',
            'phonepe_number',
            'payment_instructions',
            'uploaded_at',
            'updated_at',
            'created_by',
        ]
        read_only_fields = ['id', 'uploaded_at', 'updated_at']

    def get_qr_image_url(self, obj):
        if obj.qr_image:
            request = self.context.get('request')
            if request:
                return request.build_absolute_uri(obj.qr_image.url)
            return obj.qr_image.url
        return None

    def validate(self, attrs):
        # Resolve final values on partial updates.
        enable_qr_scan = attrs.get('enable_qr_scan', getattr(self.instance, 'enable_qr_scan', True))
        enable_bank_transfer = attrs.get('enable_bank_transfer', getattr(self.instance, 'enable_bank_transfer', True))
        enable_phonepe = attrs.get('enable_phonepe', getattr(self.instance, 'enable_phonepe', False))

        qr_image = attrs.get('qr_image', getattr(self.instance, 'qr_image', None))
        if enable_qr_scan and not qr_image:
            raise serializers.ValidationError({'qr_image': 'QR image is required when QR Scan is enabled.'})

        bank_account_number = attrs.get('bank_account_number', getattr(self.instance, 'bank_account_number', ''))
        bank_ifsc_code = attrs.get('bank_ifsc_code', getattr(self.instance, 'bank_ifsc_code', ''))
        bank_name = attrs.get('bank_name', getattr(self.instance, 'bank_name', ''))
        if enable_bank_transfer and (not bank_account_number or not bank_ifsc_code or not bank_name):
            raise serializers.ValidationError(
                {'bank_account_number': 'Bank name, account number and IFSC are required when bank transfer is enabled.'}
            )

        upi_id = attrs.get('upi_id', getattr(self.instance, 'upi_id', ''))
        phonepe_number = attrs.get('phonepe_number', getattr(self.instance, 'phonepe_number', ''))
        if enable_phonepe and not (upi_id or phonepe_number):
            raise serializers.ValidationError({'phonepe_number': 'UPI ID or PhonePe number is required when PhonePe is enabled.'})

        return attrs


class BranchSerializer(serializers.ModelSerializer):
    class Meta:
        model = Branch
        fields = [
            "id", "city", "state", "address", "phone", "email",
            "branch_type", "working_hours", "is_active", "sort_order",
            "created_at", "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]

    def create(self, validated_data):
        request = self.context.get('request')
        if request and request.user:
            validated_data['created_by'] = str(request.user.username or request.user.id)
        return super().create(validated_data)
