from rest_framework import serializers
from decimal import Decimal
from order.serializers import *
from .models import *

class VendorCreditListingSerializers (serializers.ModelSerializer) :

    transaction_id = serializers.CharField(source='order_purchase.transactions.first.transaction_id', read_only=True)  

    class Meta:
        model = WalletTransaction
        fields = ['id', 'order_purchase', 'order_item', 'transaction_id', 'transaction_type', 'amount', 'platform_fee', 'vendor_platform_fee', 'vendor_total_amount', 'status', 'credited_date', 'is_withdraw','created_at']

class VendorBankDetailSerializer(serializers.ModelSerializer) :

    class Meta:
        model = VendorBankDetail
        fields = [ 'id', 'vendor', 'bank_name', 'bank_account_number', 'account_holder_name', 'iban', 'bank_code', 'branch_name', 'branch_address', 'routing_number', 'status', 'mobile_account_number', 'mobile_account_bank', 'payout_method' ]

class VendorPayoutSerializer(serializers.ModelSerializer):
    wallet_ids = models.JSONField(default=list)
    bank_account_number = serializers.CharField(required=True, error_messages={"required": "Bank account number is required."})
    amount = serializers.DecimalField(
        max_digits=12, decimal_places=2, required=True, error_messages={"required": "Amount is required."}
    )
    
    class Meta:
        model = PayoutRequest
        fields = ['id', 'amount', 'bank', 'payment_method', 'payment_status', 'bank_account_number', 'unique_id', 'status', 'transaction_id', 'requested_date', 'wallet_ids']
      
    def validate_amount(self, value):
       
        user = self.context['request'].user
        # total_credited = WalletTransaction.objects.filter(vendor=user, transaction_type='credit', status='completed', is_withdraw=False).aggregate(total=models.Sum('vendor_total_amount'))['total'] or 0
        
        # total_payout_requested = PayoutRequest.objects.filter(vendor=user, status='pending').aggregate(total=models.Sum('amount'))['total'] or 0
       
        # available_balance = total_credited - total_payout_requested

        total_credited = WalletBalance.objects.filter(
            vendor=user
        ).values_list('balance', flat=True).first() or Decimal('0.00')

        if value > total_credited:
        # if value > available_balance:
            raise serializers.ValidationError("Insufficient balance for this payout request.")
        
        return value
    
class AdminPayoutRequestSerializer (serializers.ModelSerializer) :

    vendor = serializers.CharField(source="vendor.full_name", read_only=True)
    mobile_account_number = serializers.SerializerMethodField()

    class Meta:
        model = PayoutRequest
        fields = ['id', 'vendor', 'amount', 'requested_date', 'payment_method', 'mobile_account_number']

    def get_mobile_account_number(self, obj):
        if obj.payment_method == 'mobile_money' and obj.vendor:
            bank_detail = VendorBankDetail.objects.filter(vendor=obj.vendor).first()
            if bank_detail:
                return bank_detail.mobile_account_number or None
        return None


class AdminPayoutHistorySerializer (serializers.ModelSerializer) :

    vendor = UserSerializer(read_only=True)

    class Meta:
        model = PayoutRequest
        fields = ['id', 'transaction_id', 'vendor', 'amount', 'requested_date', 'status', 'payment_status','payment_method' ,'approval_date']

class PayoutStatusUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = PayoutRequest
        fields = ['id', 'vendor', 'amount', 'status', 'admin_note', 'bank', 'requested_date', 'approval_date', 'approved_by', 'payment_status', 'transaction_id', 'payment_method', 'wallet_ids']
    
# class VendorBankSerializer(serializers.ModelSerializer) :
#     vendor = serializers.PrimaryKeyRelatedField(queryset=User.objects.filter(is_vendor=True).all(), required=True)
#     bank_name = serializers.CharField(required=True, error_messages={"required": "Bank Name is required."})
#     bank_account_number = serializers.CharField(required=True, error_messages={"required": "Bank Account is required."})
#     account_holder_name = serializers.CharField(required=True, error_messages={"required": "Bank Account holder name is required."})
#     iban = serializers.CharField(required=True, error_messages={"required": "International bank account number is required."})
#     bank_code = serializers.CharField(required=True, error_messages={"required": "Bank code is required."})
#     branch_name = serializers.CharField(required=True, error_messages={"required": "Branch name is required."})
#     branch_address = serializers.CharField(required=True, error_messages={"required": "Branch Address is required."})
#     routing_number = serializers.CharField(required=True, error_messages={"required": "Routing Number is required."})

#     class Meta:
#         model = VendorBankDetail
#         fields = [ 'id', 'vendor', 'bank_name', 'bank_account_number', 'account_holder_name', 'iban', 'bank_code', 'branch_name', 'branch_address', 'routing_number', 'status' ]


class VendorBankSerializer(serializers.ModelSerializer):
    vendor = serializers.PrimaryKeyRelatedField(
        queryset=User.objects.filter(is_vendor=True),
        required=True
    )

    # All fields optional here; we validate conditionally
    bank_name = serializers.CharField(required=False)
    bank_account_number = serializers.CharField(required=False)
    account_holder_name = serializers.CharField(required=False)
    iban = serializers.CharField(required=False)
    bank_code = serializers.CharField(required=False)
    branch_name = serializers.CharField(required=False)
    branch_address = serializers.CharField(required=False)
    routing_number = serializers.CharField(required=False)

    payout_method = serializers.ChoiceField(
        choices=VendorBankDetail.PayoutMethod.choices,
        required=True
    )
    mobile_account_number = serializers.CharField(required=False)
    mobile_account_bank = serializers.CharField(required=False)
    mobile_verify = serializers.BooleanField(required=False)

    class Meta:
        model = VendorBankDetail
        fields = [
            'id', 'vendor', 'payout_method',
            # Bank details
            'bank_name', 'bank_account_number', 'account_holder_name', 'iban',
            'bank_code', 'branch_name', 'branch_address', 'routing_number',
            # Mobile money details
            'mobile_account_number', 'mobile_account_bank', 'mobile_verify',
            'status'
        ]

    def validate(self, attrs):
        payout_method = attrs.get('payout_method')

        if payout_method == VendorBankDetail.PayoutMethod.BANK_ACCOUNT:
            required_fields = [
                'bank_name', 'bank_account_number', 'account_holder_name',
                'iban', 'bank_code', 'branch_name', 'branch_address', 'routing_number'
            ]
            for field in required_fields:
                if not attrs.get(field):
                    raise serializers.ValidationError({field: f"{field.replace('_', ' ').capitalize()} is required for bank account."})

        elif payout_method == VendorBankDetail.PayoutMethod.MOBILE_MONEY:
            if not attrs.get('mobile_account_number'):
                raise serializers.ValidationError({'mobile_account_number': "Mobile account number is required for mobile money."})
            if not attrs.get('mobile_account_bank'):
                raise serializers.ValidationError({'mobile_account_bank': "Mobile account bank is required for mobile money."})

        else:
            raise serializers.ValidationError({'payout_method': "Invalid payout method."})

        return attrs
    


class BuyerShoppingPointListingSerializers (serializers.ModelSerializer) :

    user = UserSerializer(read_only=True)
    source_user = UserSerializer(read_only=True)
    order = OrderListingSerializer(read_only=True)

    class Meta:
        model = ShoppingPoint
        fields = ['id', 'user', 'transaction_type', 'points', 'description', 'created_at', 'order', 'source_user']
        

