Estimating fees

def get_payment_method_billing_country(payment_method_id):
    payment_method = stripe_client.v1.payment_methods.retrieve(payment_method_id)
    
    billing_country = payment_method.billing_details.address.country
    likely_currency = country_to_currency.get(billing_country, 'Unknown')
    
    return {
        'billing_country': billing_country,
        'likely_currency': likely_currency
    }
    
def estimate_conservative_fees(amount, currency="usd"):
    """
    Estimate fees with a conservative approach that covers most scenarios
    """
    # Use highest possible rate to avoid undercollecting
    percentage_fee = 0.039  # 3.9% (international rate)
    fixed_fee = 30         # $0.30
    fx_buffer = 0.01       # 1% buffer for possible FX conversion
    
    # Calculate with buffer
    stripe_fee = int(amount * (percentage_fee + fx_buffer)) + fixed_fee
    return stripe_fee

def process_payment_with_adjustment(amount, currency, connected_account_id, platform_fee_percentage):
    """
    Process payment with post-payment fee adjustment
    """
    # Step 1: Calculate your platform fee
    platform_fee = int(amount * platform_fee_percentage)
    
    # Step 2: Add conservative Stripe fee estimate
    estimated_stripe_fee = estimate_conservative_fees(amount, currency)
    total_fee = platform_fee + estimated_stripe_fee
    
    # Step 3: Process payment with conservative fee
    payment = create_payment(amount, currency, connected_account_id, total_fee)
    
    # Step 4: After payment completes, get actual Stripe fee
    actual_stripe_fee = get_actual_stripe_fee(payment.id)
    
    # Step 5: If we overestimated, issue partial refund of difference
    fee_difference = estimated_stripe_fee - actual_stripe_fee
    if fee_difference > 50:  # Only refund if difference is meaningful (e.g., >$0.50)
        issue_fee_adjustment(payment.id, fee_difference)
        
    return payment

  
   # After payment completion, retrieve the actual Stripe fee
    if intent.status == "succeeded" and intent.latest_charge:
        charge = stripe_client.v1.charges.retrieve(intent.latest_charge)
        balance_tx = stripe_client.v1.balance_transactions.retrieve(charge.balance_transaction)
        
        # Get actual Stripe fee
        actual_stripe_fee = balance_tx.fee
        
        # Now create a transfer from the connected account to your platform to cover Stripe's fee
        stripe_client.v1.transfers.create(
            params={
                "amount": actual_stripe_fee,
                "currency": currency,
                "destination": "your_platform_account_id",  # Your platform account
                "description": "Stripe fee reimbursement",
                "source_transaction": intent.latest_charge,
            }
        )
        
        print(f"Collected actual Stripe fee of {actual_stripe_fee}")
    
    return intent, actual_stripe_fee

  
def process_payment_with_fee_adjustment(stripe_client, amount, currency, customer_id, payment_method_id, connected_account_id, platform_fee_percent):
    """
    Process payment with accurate fee handling
    """
    # Calculate your platform fee only (not including Stripe's fee)
    platform_fee = int(amount * platform_fee_percent)
    
    # Create the payment intent with just your platform fee
    intent = stripe_client.v1.payment_intents.create(
        params={
            "amount": amount,
            "currency": currency,
            "customer": customer_id,
            "payment_method": payment_method_id,
            "off_session": True,
            "confirm": True,
            "on_behalf_of": connected_account_id,
            "application_fee_amount": platform_fee,  # Only your platform fee
            "transfer_data": {"destination": connected_account_id},
        }
    )
    
    # After payment completion, retrieve the actual Stripe fee
    if intent.status == "succeeded" and intent.latest_charge:
        charge = stripe_client.v1.charges.retrieve(intent.latest_charge)
        balance_tx = stripe_client.v1.balance_transactions.retrieve(charge.balance_transaction)
        
        # Get actual Stripe fee
        actual_stripe_fee = balance_tx.fee
        
        # Now create a transfer from the connected account to your platform to cover Stripe's fee
        stripe_client.v1.transfers.create(
            params={
                "amount": actual_stripe_fee,
                "currency": currency,
                "destination": "your_platform_account_id",  # Your platform account
                "description": "Stripe fee reimbursement",
                "source_transaction": intent.latest_charge,
            }
        )
        
        print(f"Collected actual Stripe fee of {actual_stripe_fee}")
    
    return intent, actual_stripe_fee