# payments/api/serializers.py
from decimal import Decimal, InvalidOperation
from django.contrib.auth import get_user_model
from rest_framework import serializers

User = get_user_model()

class WalletTopupSerializer(serializers.Serializer):
    mobile = serializers.CharField(max_length=15)
    amount = serializers.CharField()  # accept string, coerce to Decimal in validate()
    purpose_code = serializers.CharField(required=False, allow_blank=True, default='manual_admin')
    purpose_note = serializers.CharField(required=False, allow_blank=True, default='')

    PURPOSE_MAP = {
        'manual_test': 'Manual Top-Up (Testing)',
        'manual_admin': 'Manual Top-Up (Admin)',
        'oneapp_withdrawal': 'Credit from 1App Withdrawal',
        'other': 'Other',
    }

    def validate(self, attrs):
        mobile = (attrs.get('mobile') or '').strip()


        if not mobile:
            raise serializers.ValidationError({"mobile": "Mobile number is required."})

        try:
            user = User.objects.get(mobile_number=mobile)
        except User.DoesNotExist:
            raise serializers.ValidationError({"mobile": f"User with mobile {mobile} does not exist."})

        try:
            amount = Decimal((attrs.get('amount') or '').strip())
        except (InvalidOperation, TypeError):
            raise serializers.ValidationError({"amount": "Invalid amount."})

        if amount <= 0:
            raise serializers.ValidationError({"amount": "Amount must be greater than zero."})

        purpose_code = (attrs.get('purpose_code') or 'manual_admin').strip()
        purpose_note = (attrs.get('purpose_note') or '').strip()
        purpose_str = self.PURPOSE_MAP.get(purpose_code, 'Manual Top-Up (Admin)')

        # Attach normalized/derived values
        attrs['target_user'] = user

        attrs['amount'] = amount
        attrs['purpose_code'] = purpose_code
        attrs['purpose_note'] = purpose_note
        attrs['purpose_str'] = purpose_str

        # Ensure user exists
        try:
            user = User.objects.get(mobile_number=mobile)
        except User.DoesNotExist:
            raise serializers.ValidationError({"mobile": f"User with mobile {mobile} does not exist."})

        attrs['target_user'] = user
        return attrs
