from rest_framework import serializers
from .models import Withdraw
from apps.profiles.models import Profile

class WithdrawSerializer(serializers.ModelSerializer):
    user_details = serializers.SerializerMethodField(read_only=True)
    
    class Meta:
        model = Withdraw
        fields = [
            'id', 'amount', 'fee', 'final_amount', 'phone_number', 
            'pay_id', 'method', 'account_type', 'status', 'user_details', 'created_at'
        ]
        read_only_fields = ['id', 'fee', 'final_amount', 'status', 'user_details', 'created_at']

    def get_user_details(self, obj):
        return {
            "id": obj.user.id,
            "name": getattr(obj.user, 'name', 'N/A'),
            "email": obj.user.email
        }

    def validate(self, data):
        method = data.get('method')
        pay_id = data.get('pay_id')
        phone_number = data.get('phone_number')

        # Conditional Validation Logic
        if method == 'binance':
            if not pay_id:
                raise serializers.ValidationError("Pay ID is required for Binance withdrawals.")
        else:
            if not phone_number:
                raise serializers.ValidationError(f"Phone number is required for {method}.")

        return data

    def validate_amount(self, value):
        if value < 5:
            raise serializers.ValidationError("Minimum withdrawal amount is $5.")
        
        request = self.context.get('request')
        if request and request.user.is_authenticated:
            # Check balance against the Profile model
            profile = Profile.objects.filter(user=request.user).first()
            if not profile or profile.balance < value:
                raise serializers.ValidationError(f"Insufficient balance. Your balance is {profile.balance if profile else 0}")
        return value