from rest_framework import serializers

# Allowed service keys used by the app
SERVICE_CHOICES = [
    "postpaid", "electricity", "fastag", "landline", "broadband",
    "gas", "insurance", "loan", "water", "dth",
    "lpg", "playcode",           # ← add these

]

def _normalize_service(value: str) -> str:
    v = (value or "").strip().lower()
    if v in ("fast tag", "fasttag"):
        return "fastag"
    return v

class ServiceField(serializers.CharField):
    def to_internal_value(self, data):
        v = super().to_internal_value(data)
        return _normalize_service(v)

class ProvidersQuery(serializers.Serializer):
    service = ServiceField()
    def validate_service(self, v):
        if v not in SERVICE_CHOICES:
            raise serializers.ValidationError("Unsupported service")
        return v

class BillValidateReq(serializers.Serializer):
    service = ServiceField()
    provider = serializers.CharField()
    fields = serializers.DictField(
        child=serializers.CharField(allow_blank=True),
        allow_empty=True,
        required=False,
        default=dict,
    )
    def validate_service(self, v):
        if v not in SERVICE_CHOICES:
            raise serializers.ValidationError("Unsupported service")
        return v

class PerformBillPayReq(serializers.Serializer):
    service = ServiceField()
    provider = serializers.CharField()
    amount = serializers.IntegerField(min_value=1)
    fields = serializers.DictField(
        child=serializers.CharField(allow_blank=True),
        allow_empty=True,
        required=False,
        default=dict,
    )
    use_external = serializers.BooleanField(required=False, default=False)
    use_viralpe = serializers.BooleanField(required=False, default=True)
    order_id = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    razorpay_order_id = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    razorpay_payment_id = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    razorpay_signature = serializers.CharField(required=False, allow_blank=True, allow_null=True)

    def validate_service(self, v):
        if v not in SERVICE_CHOICES:
            raise serializers.ValidationError("Unsupported service")
        return v

class StatusQuery(serializers.Serializer):
    txn_id = serializers.CharField()
