<?php

if (!class_exists('ARM_Stripe')) {

    class ARM_Stripe {

        var $arm_stripe_api_version;
        function __construct() {
            $this->arm_stripe_api_version = "2020-08-27";
            add_action('arm_payment_gateway_validation_from_setup', array($this, 'arm_payment_gateway_form_submit_action'), 10, 4);
            //add_action('wp', array($this, 'arm_StripeEventListener'), 5);
            add_action('arm_cancel_subscription_gateway_action', array($this, 'arm_cancel_stripe_subscription'), 10, 2);

            add_filter('arm_payment_gateway_trial_allowed', array($this, 'arm_stripe_trial_allowed_or_not'), 10, 5);

            add_action('arm_saved_subscription_plan', array($this, 'arm_update_stripe_configuration_setup'), 10, 2);

            add_action('wp_ajax_arm_stripe_dismisss_admin_notice',array(&$this,'arm_stripe_dismisss_admin_notice'),10);

            add_filter('arm_refund_payment_subscription_stripe',array($this,'arm_refund_payment_subscription'),10,2);

            add_filter('arm_display_refund_button_from_outside',array($this,'arm_display_refund_button_from_outside'),10,2);
        }

        function arm_display_refund_button_from_outside($display,$pg)
        {
            if($pg == 'stripe')
            {
                $display = true;
            }
            return $display;
        }

        function arm_refund_payment_subscription($arm_refund_data,$payment_gateway)
        {
            
            global $wpdb, $ARMember, $arm_global_settings, $payment_done, $arm_payment_gateways, $arm_membership_setup, 
            $arm_manage_coupons, $arm_transaction, $arm_debug_payment_log_id;
            
            $arm_transaction_id = !empty($arm_refund_data['arm_transaction_id']) ? $arm_refund_data['arm_transaction_id'] :'';
            if($payment_gateway == 'stripe' && !empty($arm_refund_data))
            {
                $all_payment_gateways = $arm_payment_gateways->arm_get_active_payment_gateways();
                $stripe_options = $all_payment_gateways['stripe'];
                $currency = $arm_payment_gateways->arm_get_global_currency();
                $arm_stripe_secret_key = "";
                if ($stripe_options['stripe_payment_mode'] == 'live') {
                    $arm_stripe_secret_key = $stripe_options['stripe_secret_key'];
                } else {
                    $arm_stripe_secret_key = $stripe_options['stripe_test_secret_key'];
                }
                
                if(!empty($arm_transaction_id ) && !empty($arm_refund_data['arm_refund_mode'])) {  
                    $response = array();
                    if('in_' == substr($arm_transaction_id,0,3))
                    {
                        $arm_invoices_url = "https://api.stripe.com/v1/invoices/".$arm_transaction_id;

                        $arm_subs_data = array(
                            'headers' => array(
                                'Authorization' => 'Bearer '.$arm_stripe_secret_key
                            ),
                        );
                        $arm_stripe_invoices_response = wp_remote_get($arm_invoices_url, $arm_subs_data);
                        if(!empty($arm_stripe_invoices_response))
                        {
                            $arm_stripe_invoice_response = json_decode($arm_stripe_invoices_response['body']);
                            $arm_transaction_id = !empty($arm_stripe_invoice_response['charge']) ? $arm_stripe_invoice_response['charge'] : '';
                        }
                    }
                    if('pi' == substr($arm_transaction_id, 0, 2) ) {
                        $arm_send_refund_data = array('payment_intent' => $arm_transaction_id);
                    }
                    else
                    {
                        $arm_send_refund_data = array('charge' => $arm_transaction_id);
                    }

                    $arm_refund_type = $arm_refund_data['arm_refund_mode'] ? $arm_refund_data['arm_refund_mode'] : '';

                    if($arm_refund_type != 'full') {
                        $zero_demial_currencies = $arm_payment_gateways->arm_stripe_zero_decimal_currency_array();
                        $arm_refund_amount = $arm_refund_data['arm_refund_amount'] ? $arm_refund_data['arm_refund_amount'] : 0;
                        $arm_send_refund_data['amount'] = ((float)$arm_refund_amount);
                        if (!in_array($currency, $zero_demial_currencies)) {
                            $arm_send_refund_data['amount'] = ((float)$arm_refund_amount) * 100;
                        }
                    }

                    
                    do_action('arm_payment_log_entry', 'stripe', 'Stripe submited refund data', 'armember', $arm_send_refund_data, $arm_debug_payment_log_id);
                    try{
                        $refund_api_url = 'https://api.stripe.com/v1/refunds';

                        $arm_stripe_plan_headers = array(
                            'Authorization' => 'Bearer '.$arm_stripe_secret_key
                        );

                        $arm_stripe_plan_data = array('method' => 'POST', 'headers' => $arm_stripe_plan_headers, 'body' => $arm_send_refund_data);

                        $arm_get_stripe_plan_list_response = wp_remote_request($refund_api_url, $arm_stripe_plan_data);
                        $response_body = json_decode($arm_get_stripe_plan_list_response['body']);
                        if(!empty( $response_body ))
                        {
                            do_action('arm_payment_log_entry', 'stripe', 'Stripe refund resoponse', 'armember', $response_body, $arm_debug_payment_log_id);
                            if(!empty($response_body->id))
                            {
                                $success_message = esc_html__('Payment refunded successfully', 'ARMember');
                                $response['type'] = 'success';
                                $response['msg'] = $success_message;
                            }
                            else
                            {
                                $response['type'] = 'error';
                                $response['msg'] = $response_body->error->message;
                            }
                        }
                        return $response;
                    }
                    catch (Exception $e){
                        $error_message = '';
                        $error_message = esc_html__('Error Code', 'ARMember').':'.$e->getCode().' '. $e->getMessage();
                        
                        do_action('arm_payment_log_entry', 'stripe', 'Stripe refund resoponse with error', 'armember', $error_message, $arm_debug_payment_log_id);
                           
                        $response['type'] = 'error';
                        $response['msg'] = $error_message;
                        return $response;
                    }
                }
            }
        }

        function arm_stripe_dismisss_admin_notice()
        {
            if (  current_user_can( 'manage_options' )){

                $arm_wp_nonce = !empty( $_POST['_wpnonce'] ) ? sanitize_text_field( $_POST['_wpnonce'] ) : ''; //phpcs:ignore
                if(wp_verify_nonce( $arm_wp_nonce, 'arm_wp_nonce' )){
    
                    update_option('arm-stripe-dismiss-admin-notice', false);
    
                    echo json_encode( array( 'status' => 'success' ) );
                }
                else{
                    echo json_encode( array( 'status' => 'error', 'message' => esc_html__('Security check failed, please try again.', 'ARMember') ) );
                }
                
            }else{
                echo json_encode( array( 'status' => 'error', 'message' => esc_html__('You do not have sufficient permissions to access this page.', 'ARMember') ) );
            }
            exit;
        }

        function arm_stripe_trial_allowed_or_not($trial_not_allowed, $arm_plan_id, $payment_gateway, $payment_gateway_options, $posted_data){
            if($payment_gateway == "stripe"){
                $trial_not_allowed = 0;
            }
            return $trial_not_allowed;
        }

        function arm_prepare_stripe_charge_details($request_data = array(), $plan = object, $setup_id = 0, $payment_cycle = 0, $plan_action = '') {
            global $wpdb, $ARMember, $arm_global_settings, $payment_done, $arm_payment_gateways, $arm_membership_setup, $arm_manage_coupons, $arm_transaction, $arm_debug_payment_log_id;
            $charge_details = array();
        
            $general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
            $arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
            //$arm_stripe_amount_multiply = str_pad(1, $arm_currency_decimal, 0, STR_PAD_RIGHT);
            $arm_stripe_amount_multiply = 100;
        
            $arm_payment_debug_log_data = array(
                'request_data' => $request_data,
                'plan' => $plan,
                'setup_id' => $setup_id,
                'payment_cycle' => $payment_cycle,
                'plan_action' => $plan_action,
            );

            do_action('arm_payment_log_entry', 'stripe', 'prepare charge details', 'armember', $arm_payment_debug_log_data, $arm_debug_payment_log_id);
           
            if (!empty($request_data)) {
                $currency = $arm_payment_gateways->arm_get_global_currency();
                $zero_demial_currencies = $arm_payment_gateways->arm_stripe_zero_decimal_currency_array();
                $entry_id = $request_data['entry_id'];
                $entry_email = $request_data['entry_email'];
                $stripe_card_detail = isset( $request_data['stripe'] ) ? $request_data['stripe'] : array();
                $card_holder_name = isset( $stripe_card_detail['card_holder_name'] ) ? $stripe_card_detail['card_holder_name'] : '';
                $card_number = isset( $stripe_card_detail['card_number'] ) ? $stripe_card_detail['card_number'] : '';
                $exp_month = isset( $stripe_card_detail['exp_month'] ) ? $stripe_card_detail['exp_month'] : '';
                $exp_year = isset( $stripe_card_detail['exp_year'] ) ? $stripe_card_detail['exp_year'] : '';
                $cvc = isset( $stripe_card_detail['cvc'] ) ? $stripe_card_detail['cvc'] : '';
                $arm_is_trial = '0';
                $formSlug = isset($request_data['arm_action']) ? $request_data['arm_action'] : '';
                $arm_user_old_plan = $request_data['arm_user_old_plan_ids'];

                $form = new ARM_Form('slug', $formSlug);
                if ($plan->is_recurring()) {
                   
                    $recurring_data = $plan->prepare_recurring_data($payment_cycle);
                    $amount = str_replace(",", "", $recurring_data['amount']);

                    $payment_mode_ = !empty($request_data['arm_selected_payment_mode']) ? $request_data['arm_selected_payment_mode'] : 'manual_subscription';
                    if(isset($request_data['arm_payment_mode']['stripe'])){
                        $payment_mode_ = !empty($request_data['arm_payment_mode']['stripe']) ? $request_data['arm_payment_mode']['stripe'] : 'manual_subscription';
                    }
                    else{
                        $setup_data = $arm_membership_setup->arm_get_membership_setup($setup_id);
                        if (!empty($setup_data) && !empty($setup_data['setup_modules']['modules'])) {
                            $setup_modules = $setup_data['setup_modules'];
                            $modules = $setup_modules['modules'];
                            $payment_mode_ = $modules['payment_mode']['stripe'];
                        }
                    }
                    $plan_id = (!empty($request_data['subscription_plan'])) ? $request_data['subscription_plan'] : 0;
                    if ($plan_id == 0) {
                        $plan_id = (!empty($request_data['_subscription_plan'])) ? $request_data['_subscription_plan'] : 0;
                    }
                    $payment_mode = 'manual_subscription';
                    $c_mpayment_mode = "";
                    if(isset($request_data['arm_pay_thgough_mpayment']) && $request_data['arm_plan_type']=='recurring' && is_user_logged_in())
                    {
                        $current_user_id = get_current_user_id();
                        $current_user_plan_ids = get_user_meta($current_user_id, 'arm_user_plan_ids', true);
                        $current_user_plan_ids = !empty($current_user_plan_ids) ? $current_user_plan_ids : array();
                        $Current_M_PlanData = get_user_meta($current_user_id, 'arm_user_plan_' . $plan_id, true);
                        $Current_M_PlanDetails = $Current_M_PlanData['arm_current_plan_detail'];
                        if (!empty($current_user_plan_ids)) {
                            if(in_array($plan_id, $current_user_plan_ids) && !empty($Current_M_PlanDetails))
                            {
                                $arm_cmember_paymentcycle = $Current_M_PlanData['arm_payment_cycle'];
                                $arm_cmember_completed_recurrence = $Current_M_PlanData['arm_completed_recurring'];
                                $arm_cmember_plan = new ARM_Plan(0);
                                $arm_cmember_plan->init((object) $Current_M_PlanDetails);
                                $arm_cmember_plan_data = $arm_cmember_plan->prepare_recurring_data($arm_cmember_paymentcycle);
                                $arm_cmember_TotalRecurring = $arm_cmember_plan_data['rec_time'];
                                if ($arm_cmember_TotalRecurring == 'infinite' || ($arm_cmember_completed_recurrence !== '' && $arm_cmember_completed_recurrence != $arm_cmember_TotalRecurring)) {
                                    $c_mpayment_mode = 1;
                                }
                            }
                        }
                    }
                    if(empty($c_mpayment_mode))
                    {
                        if ($payment_mode_ == 'both') {
                            $payment_mode = !empty($request_data['arm_selected_payment_mode']) ? $request_data['arm_selected_payment_mode'] : 'manual_subscription';
                        } else {
                            $payment_mode = $payment_mode_;
                        }
                    }
                } else {
                    
                    $amount = str_replace(",", "", $plan->amount);
                    $payment_mode = '';
                }

                $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');

                $maskCCNum = $arm_transaction->arm_mask_credit_card_number($card_number);
                $extraParam = array('card_number' => $maskCCNum, 'plan_amount' => $amount, 'paid_amount' => $amount);
                /* Coupon Details */
                $discount_amt = $coupon_amount = $arm_coupon_on_each_subscriptions = $arm_coupon_discount = 0;
                $coupon_code = $arm_coupon_discount_type_default = $arm_coupon_discount_type = '';

                if ($arm_manage_coupons->isCouponFeature && isset($request_data['arm_coupon_code']) && !empty($request_data['arm_coupon_code'])) {
                    $couponApply = $arm_manage_coupons->arm_apply_coupon_code($request_data['arm_coupon_code'], $plan, $setup_id, $payment_cycle, $arm_user_old_plan);

                    if($couponApply["status"] == "success") {
                        $coupon_code = $request_data['arm_coupon_code'];
                        $coupon_amount = isset($couponApply['coupon_amt']) ? $couponApply['coupon_amt'] : 0;
                        $coupon_amount = str_replace(",", "", $coupon_amount);

                        $discount_amt = isset($couponApply['total_amt']) ? $couponApply['total_amt'] : $amount;
                        $discount_amt = str_replace(",", "", $discount_amt);

                        $arm_coupon_on_each_subscriptions = isset($couponApply['arm_coupon_on_each_subscriptions']) ? $couponApply['arm_coupon_on_each_subscriptions'] : '0';
                        $arm_coupon_discount_type_default = isset($couponApply['discount_type']) ? $couponApply['discount_type'] : "";

                        $arm_coupon_discount = (isset($couponApply['discount']) && !empty($couponApply['discount'])) ? $couponApply['discount'] : 0;
                        $global_currency = $arm_payment_gateways->arm_get_global_currency();
                        $arm_coupon_discount_type = ($couponApply['discount_type'] != 'percentage') ? $global_currency : "%";
                        $extraParam['coupon'] = array(
                            'coupon_code' => $request_data['arm_coupon_code'],
                            'amount' => $coupon_amount,
                        );

                        $charge_details['coupon_details'] = array (
                            'coupon_code' => $request_data['arm_coupon_code'],
                            'arm_coupon_discount' => $arm_coupon_discount,
                            'arm_coupon_discount_type' => $arm_coupon_discount_type,
                            'arm_coupon_discount_type_default' => $arm_coupon_discount_type_default,
                            'arm_coupon_on_each_subscriptions' => $arm_coupon_on_each_subscriptions
                        );
                    }
                }
                else {
                    $request_data['arm_coupon_code'] = '';
                }

                if ($payment_mode == 'auto_debit_subscription') {
                    /* Recurring Options */
                    
                    $stripePlanID = $request_data['stripePlanID'];

                    if (!empty($stripePlanID)) {
                        $charge_details['plan'] = $stripePlanID;
                    }

                    if( $amount > 0 && $arm_coupon_on_each_subscriptions == 1 ) {                       

                        if( $couponApply['discount_type'] == "fixed" ) {
                            $amount = $amount - $couponApply['discount'];
                        }
                        else if($couponApply['discount_type'] == "percentage") {
                            $arm_amount_to_minus = ( $amount * $couponApply['discount'] ) / 100;
                            $amount = $amount - $arm_amount_to_minus;
                        }

                        if( $amount < 0 ) {
                            $amount = 0;
                        }
                    }

                    if($request_data['tax_percentage'] > 0) {
                        $tax_display_type = (!empty($request_data['arm_tax_include_exclude_flag']) && $request_data['arm_tax_include_exclude_flag'] == 1) ? 1 : 0;
                        if(empty($tax_display_type))
                        {
                            $extraParam['arm_tax_include_exclude_flag'] = 0;
                            $tax_amount = ($request_data['tax_percentage'] * $amount)/100;
                            $tax_amount= number_format((float) $tax_amount, $arm_currency_decimal, '.', '');
                            $amount = $amount + $tax_amount;
                            $tax_amount = $arm_payment_gateways->arm_amount_set_separator($currency, $tax_amount);
                        }
                        else
                        {
                            $extraParam['arm_tax_include_exclude_flag'] = 1;
                            $tax_amount = $arm_membership_setup->arm_calculate_included_tax($amount,$tax_percentage);
                            $tax_amount = number_format((float)$tax_amount, $arm_currency_decimal, '.', '');
                        }
                        $charge_details['tax_amount'] = $tax_amount;
                    }

                    $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');

                    $extraParam['paid_amount'] = $amount;

                    if ($plan->has_trial_period() && $plan_action == 'new_subscription') {
                        if(empty($arm_coupon_on_each_subscriptions))
                        {
                            unset($charge_details['coupon_details']);
                        }
                    }
                } else if ($payment_mode == 'manual_subscription') {
                    $rec_opt = $plan->prepare_recurring_data($payment_cycle);
                    $allow_trial = true;
                    if (is_user_logged_in()) {
                        $user_id = get_current_user_id();
                        $user_plan = get_user_meta($user_id, 'arm_user_plan_ids', true);

                        if (!empty($user_plan)) {
                            $allow_trial = false;
                        }
                    }
                    if ($plan->has_trial_period() && $allow_trial) {
                        $arm_is_trial = '1';
                        $amount = $rec_opt['trial']['amount'];

                        $trial_amount = $rec_opt['trial']['amount'];
                        $trial_period = $rec_opt['trial']['period'];
                        $trial_interval = $rec_opt['trial']['interval'];
                        $extraParam['trial'] = array(
                            'amount' => $trial_amount,
                            'period' => $trial_period,
                            'interval' => $trial_interval,
                        );
                    }
                    if (!empty($coupon_amount) && $coupon_amount > 0) {
                        $amount = $discount_amt;
                    }

                    $amount = str_replace(",", "", $amount);

                    if($request_data['tax_percentage'] > 0){

                        $tax_amount = ($request_data['tax_percentage'] * $amount)/100;
                        $tax_amount= number_format((float) $tax_amount, $arm_currency_decimal, '.', '');
                        $amount = $amount + $tax_amount;
                        $tax_amount = $arm_payment_gateways->arm_amount_set_separator($currency, $tax_amount);
                        $charge_details['tax_amount'] = $tax_amount;
                    }

                    $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');

                    $extraParam['paid_amount'] = $amount;

                    if (!empty($amount)) {
                        if (!in_array($currency, $zero_demial_currencies)) {
                            $amount = $amount * $arm_stripe_amount_multiply;
                            $amount = number_format($amount,0,".","");
                        }
                        else{
                            $amount = number_format((float) $amount, 0);
                            $amount = str_replace(",", "", $amount);
                        }
                    }
                    else {
                        $amount = "0.00";
                    }

                    $charge_details['amount'] = $amount;
                    $charge_details['currency'] = $currency;

                    if ($amount == 0 || $amount == '0.00') {
                        $return_array = array();
                        unset($extraParam['card_number']);
                        if (is_user_logged_in()) {
                            $current_user_id = get_current_user_id();
                            $return_array['arm_user_id'] = $current_user_id;
                            $arm_user_info = get_userdata($current_user_id);
                            $return_array['arm_first_name']=$arm_user_info->first_name;
                            $return_array['arm_last_name']= $arm_user_info->last_name;
                        }else{
                            $return_array['arm_first_name']=(isset($request_data['first_name']))?$request_data['first_name']:'';
                            $return_array['arm_last_name']=(isset($request_data['last_name']))?$request_data['last_name']:'';
                        }
                        $return_array['arm_plan_id'] = $plan->ID;
                        $return_array['arm_payment_gateway'] = 'stripe';
                        $return_array['arm_payment_type'] = $plan->payment_type;
                        $return_array['arm_token'] = '-';
                        $return_array['arm_payer_email'] = $entry_email;
                        $return_array['arm_receiver_email'] = '';
                        $return_array['arm_transaction_id'] = '-';
                        $return_array['arm_transaction_payment_type'] = $plan->payment_type;
                        $return_array['arm_transaction_status'] = 'completed';
                        $return_array['arm_payment_mode'] = $payment_mode;
                        $return_array['arm_payment_date'] = current_time( 'mysql' );
                        $return_array['arm_amount'] = 0;
                        $return_array['arm_currency'] = $currency;
                        $return_array['arm_coupon_code'] = @$coupon_code;
                        $return_array['arm_coupon_discount'] = @$arm_coupon_discount;
                        $return_array['arm_coupon_discount_type'] = @$arm_coupon_discount_type;
                        $return_array['arm_extra_vars'] = maybe_serialize($extraParam);
                        $return_array['arm_is_trial'] = $arm_is_trial;
                        $return_array['arm_created_date'] = current_time('mysql');
                        $return_array['arm_coupon_on_each_subscriptions'] = $arm_coupon_on_each_subscriptions;
                        $payment_log_id = $arm_payment_gateways->arm_save_payment_log($return_array);
                        do_action('arm_after_stripe_free_manual_payment', $plan, $payment_log_id, $arm_is_trial, @$coupon_code, $extraParam);
                        return array('status' => TRUE, 'log_id' => $payment_log_id, 'entry_id' => $entry_id);
                    }
                } else {
                    /* Coupon Details */
                    if (!empty($coupon_amount) && $coupon_amount > 0) {
                        $amount = $discount_amt;
                    }

                    $amount = str_replace(",", "", $amount);
                    
                    /* Make Amount in Cent */

                    if($request_data['tax_percentage'] > 0){

                        $tax_amount = ($request_data['tax_percentage'] * $amount)/100;
                        $tax_amount= number_format((float) $tax_amount, $arm_currency_decimal, '.', '');
                        $amount = $amount + $tax_amount;
                        $tax_amount = $arm_payment_gateways->arm_amount_set_separator($currency, $tax_amount);
                        $charge_details['tax_amount'] = $tax_amount;
                    }

                    $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');

                    $extraParam['paid_amount'] = $amount;

                    if (!empty($amount)) {
                        if (!in_array($currency, $zero_demial_currencies)) {
                            $amount = $amount * $arm_stripe_amount_multiply;
                            $amount = number_format($amount,0,".","");
                        }
                        else{
                            $amount = number_format((float) $amount, 0);
                            $amount = str_replace(",", "", $amount);
                        }
                    } else {
                        $amount = "0";
                    }
                    $charge_details['amount'] = $amount;
                    $charge_details['currency'] = $currency;
                    if ($amount == 0 || $amount == '0.00') {
                        $return_array = array();
                        unset($extraParam['card_number']);
                        if (is_user_logged_in()) {
                            $current_user_id = get_current_user_id();
                            $return_array['arm_user_id'] = $current_user_id;
                            $arm_user_info = get_userdata($current_user_id);
                            $return_array['arm_first_name']=$arm_user_info->first_name;
                            $return_array['arm_last_name']=$arm_user_info->last_name;
                        }else{
                            $return_array['arm_first_name']=(isset($request_data['first_name']))?$request_data['first_name']:'';
                            $return_array['arm_last_name']=(isset($request_data['last_name']))?$request_data['last_name']:'';
                        }
                        $return_array['arm_plan_id'] = $plan->ID;
                        $return_array['arm_payment_gateway'] = 'stripe';
                        $return_array['arm_payment_type'] = $plan->payment_type;
                        $return_array['arm_token'] = '-';
                        $return_array['arm_payer_email'] = $entry_email;
                        $return_array['arm_receiver_email'] = '';
                        $return_array['arm_transaction_id'] = '-';
                        $return_array['arm_transaction_payment_type'] = $plan->payment_type;
                        $return_array['arm_transaction_status'] = 'completed';
                        $return_array['arm_payment_mode'] = '';
                        $return_array['arm_payment_date'] = current_time( 'mysql' );
                        $return_array['arm_amount'] = 0;
                        $return_array['arm_currency'] = $currency;
                        $return_array['arm_coupon_code'] = @$coupon_code;
                        $return_array['arm_coupon_discount'] = @$arm_coupon_discount;
                        $return_array['arm_coupon_discount_type'] = @$arm_coupon_discount_type;
                        $return_array['arm_extra_vars'] = maybe_serialize($extraParam);
                        $return_array['arm_is_trial'] = $arm_is_trial;
                        $return_array['arm_created_date'] = current_time('mysql');
                        $return_array['arm_coupon_on_each_subscriptions'] = $arm_coupon_on_each_subscriptions;
                        $payment_log_id = $arm_payment_gateways->arm_save_payment_log($return_array);
                        do_action('arm_after_stripe_free_payment', $plan, $payment_log_id, $arm_is_trial, @$coupon_code, $extraParam);
                        return array('status' => TRUE, 'log_id' => $payment_log_id, 'entry_id' => $entry_id);
                    }
                    if (isset($request_data['user_email']) && $request_data['user_email'] != "") {
                        $charge_details['receipt_email'] = $request_data['user_email'];
                    }
                    if ($plan->name != "") {
                        $charge_details['description'] = $plan->name;
                    }
                }
                $custom_var = $entry_id . '|' . $entry_email . '|' . $form->ID . '|' . $plan->payment_type . '|' . $payment_mode;
                $charge_details['metadata'] = array('custom' => $custom_var, 'tax_percentage' => $request_data['tax_percentage'].'%','customer_email' => $entry_email);

                /*if (!empty($request_data['stripeToken'])) {
                    $charge_details['source'] = $request_data['stripeToken'];
                } else {*/

                    $first_name = (isset($request_data['first_name']) && !empty($request_data['first_name'])) ? $request_data['first_name'] : '';
                    $last_name = (isset($request_data['last_name']) && !empty($request_data['last_name'])) ? $request_data['last_name'] : '';
                    if($card_holder_name != '') {
                        $stripe_display_name = $card_holder_name;
                    }
                    else if ($first_name != '' && $last_name != '') {
                        $stripe_display_name = $first_name . " " . $last_name;
                    } else {
                        $stripe_display_name = sanitize_user($entry_email);
                    }
                    $charge_details['card'] = array(
                        "number" => $card_number,
                        "exp_month" => $exp_month,
                        "exp_year" => $exp_year,
                        "cvc" => $cvc,
                        'name' => $stripe_display_name,
                        'email' => sanitize_user($entry_email),
                        'address_line1' => '',
                        'address_line2' => '',
                        'address_city' => '',
                        'address_zip' => '',
                        'address_state' => '',
                        'address_country' => '',
                    );
                //}

                $charge_details['email'] = sanitize_user($entry_email);
                $extraParam['arm_is_trial'] = $arm_is_trial;
                $charge_details['extraVars'] = $extraParam;
            }

            do_action('arm_payment_log_entry', 'stripe', 'return prepared charge details', 'armember', $charge_details, $arm_debug_payment_log_id);

            return $charge_details;
        }

        function arm_prepare_stripe_charge_details_for_single_payment($request_data = array(), $setup_id = 0, $payment_cycle = 0,$arm_return_data=array()) {
            global $wpdb, $ARMember, $arm_global_settings, $payment_done, $arm_payment_gateways, $arm_membership_setup, $arm_manage_coupons, $arm_transaction, $arm_debug_payment_log_id,$arm_pro_ration_feature;
        
            $general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
            $arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
            //$arm_stripe_amount_multiply = str_pad(1, $arm_currency_decimal, 0, STR_PAD_RIGHT);
            $arm_stripe_amount_multiply = 100;
        
            $arm_debug_payment_log_data = array(
                'request_data' => $request_data,
                'setup_id' => $setup_id,
                'payment_cycle' => $payment_cycle,
            );
            do_action('arm_payment_log_entry', 'stripe', 'prepare charge details for single payment', 'armember', $arm_debug_payment_log_data, $arm_debug_payment_log_id);
         
            $charge_details = array();
            if (!empty($request_data)) {
                $currency = $arm_payment_gateways->arm_get_global_currency();
                $entry_id = $request_data['entry_id'];
                $entry_email = $request_data['entry_email'];
                $stripe_card_detail = !empty($request_data['stripe']) ? $request_data['stripe'] : '';
                $card_holder_name = !empty($stripe_card_detail['card_holder_name']) ? $stripe_card_detail['card_holder_name'] : '';
                $card_number = !empty($stripe_card_detail['card_number']) ? $stripe_card_detail['card_number']: '';
                $exp_month = !empty($stripe_card_detail['exp_month']) ? $stripe_card_detail['exp_month'] : '';
                $exp_year = !empty($stripe_card_detail['exp_year']) ? $stripe_card_detail['exp_year'] : '';
                $cvc = !empty($stripe_card_detail['cvc']) ? $stripe_card_detail['cvc'] :'';
                $formSlug = isset($request_data['arm_action']) ? $request_data['arm_action'] : '';
                $arm_user_old_plan = $request_data['arm_user_old_plan_ids'];
                $subscriptionPlanID = (!empty($request_data['subscription_plan'])) ? $request_data['subscription_plan'] : 0;
                if ($subscriptionPlanID == 0) {
                    $subscriptionPlanID = (!empty($request_data['_subscription_plan'])) ? $request_data['_subscription_plan'] : 0;
                }
                $form = new ARM_Form('slug', $formSlug);
                $plan = ($arm_pro_ration_feature->isProRationFeature && !empty( $arm_return_data['arm_is_prorated'] ) && !empty($arm_return_data['arm_plan_obj'])) ? $arm_return_data['arm_plan_obj'] : new ARM_Plan($subscriptionPlanID);
                $recurring_data = $plan->prepare_recurring_data($payment_cycle);

                $amount = $recurring_data['trial']['amount'];
                $amount = str_replace(",", "", $amount);

                $trial_period = $recurring_data['trial']['period'];
                $trial_interval = $recurring_data['trial']['interval'];
                
                $plan_amount = $recurring_data['amount'];
                $plan_amount = str_replace(",", "", $plan_amount);

                $maskCCNum = $arm_transaction->arm_mask_credit_card_number($card_number);
                $extraParam = array('card_number' => $maskCCNum, 'plan_amount' => $amount, 'paid_amount' => $amount);
                $discount_amt = $coupon_amount = 0;
                /* Coupon Details */
                if ($arm_manage_coupons->isCouponFeature && isset($request_data['arm_coupon_code']) && !empty($request_data['arm_coupon_code'])) {
                    $couponApply = $arm_manage_coupons->arm_apply_coupon_code($request_data['arm_coupon_code'], $plan, $setup_id, $payment_cycle, $arm_user_old_plan);
                    $coupon_amount = isset($couponApply['coupon_amt']) ? $couponApply['coupon_amt'] : 0;
                    $coupon_amount = str_replace(",", "", $coupon_amount);

                    $discount_amt = isset($couponApply['total_amt']) ? $couponApply['total_amt'] : $amount;
                    $discount_amt = str_replace(",", "", $discount_amt);

                    $arm_coupon_on_each_subscriptions = isset($couponApply['arm_coupon_on_each_subscriptions']) ? $couponApply['arm_coupon_on_each_subscriptions'] : '0';
                    $arm_coupon_discount_type_default = isset($couponApply['discount_type']) ? $couponApply['discount_type'] : "";

                    $arm_coupon_discount = (isset($couponApply['discount']) && !empty($couponApply['discount'])) ? $couponApply['discount'] : 0;
                    $global_currency = $arm_payment_gateways->arm_get_global_currency();
                    $arm_coupon_discount_type = ($couponApply['discount_type'] != 'percentage') ? $global_currency : "%";
                    if (!empty($coupon_amount) && $coupon_amount > 0) {
                        $extraParam['coupon'] = array(
                            'coupon_code' => $request_data['arm_coupon_code'],
                            'amount' => $coupon_amount,
                        );

                        $charge_details['coupon_details'] = array(
                            'coupon_code' => $request_data['arm_coupon_code'],
                            'arm_coupon_discount' => $arm_coupon_discount,
                            'arm_coupon_discount_type' => $arm_coupon_discount_type,
                            'arm_coupon_discount_type_default' => $arm_coupon_discount_type_default,
                            'arm_coupon_on_each_subscriptions' => $arm_coupon_on_each_subscriptions
                        );
                    }
                } else {
                    $request_data['arm_coupon_code'] = '';
                }

                $extraParam['trial'] = array(
                    'amount' => $amount,
                    'period' => $trial_period,
                    'interval' => $trial_interval,
                );

                /* Coupon Details */
                if (!empty($coupon_amount) && $coupon_amount > 0) {
                    $amount = $discount_amt;
                }

                $amount = str_replace(",", "", $amount);

                if(!empty($arm_pro_ration_feature->isProRationFeature) && !empty( $arm_return_data['arm_is_prorated'] ) ){
                    $request_data['tax_percentage'] = 0;
                }

                
                if($request_data['tax_percentage'] > 0 ) {
                    
                    $tax_display_type = (!empty($request_data['arm_tax_include_exclude_flag']) && $request_data['arm_tax_include_exclude_flag'] == 1) ? 1 : 0;
                    if( empty($tax_display_type) )
                    {
                        $extraParam['arm_tax_include_exclude_flag'] = 0;
                        $tax_amount = ($request_data['tax_percentage'] * $amount)/100;
                        $tax_amount= number_format((float) $tax_amount, $arm_currency_decimal, '.', '');
                        $tax_amount = $arm_payment_gateways->arm_amount_set_separator($currency, $tax_amount);
                        $amount = $amount + $tax_amount;
                    }
                    else
                    {
                        $extraParam['arm_tax_include_exclude_flag'] = 1;
                        $tax_amount = $arm_membership_setup->arm_calculate_included_tax($amount,$request_data['tax_percentage']);
                        $tax_amount= number_format((float) $tax_amount, $arm_currency_decimal, '.', '');
                    }
                    $charge_details['tax_amount'] = $tax_amount;
                }

                $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');
                  $extraParam['paid_amount'] = $amount;

                $zero_demial_currencies = $arm_payment_gateways->arm_stripe_zero_decimal_currency_array();
                if (!empty($amount)) {
                    if (!in_array($currency, $zero_demial_currencies)) {
                        $amount = $amount * $arm_stripe_amount_multiply;
                        $amount = number_format($amount,0,".","");
                    }
                    else{
                        $amount = number_format($amount, 0,".",'');
                        $amount = str_replace(",", "", $amount);
                    }
                } else {
                    $amount = "0.00";
                }
                /* Make Amount in Cent */
              
                $charge_details['amount'] = $amount;
                $charge_details['currency'] = $currency;

                //if (isset($request_data['user_email']) && $request_data['user_email'] != "") {
                    $charge_details['receipt_email'] = !empty($request_data['user_email']) ? $request_data['user_email'] : $entry_email;
                //}
                if ($plan->name != "") {
                    $charge_details['description'] = $plan->name;
                }

                $custom_var = $entry_id . '|' . $entry_email . '|' . $form->ID . '|' . $plan->payment_type;
                $charge_details['metadata'] = array('custom' => $custom_var, 'tax_percentage' => $request_data['tax_percentage'].'%','customer_email' => $entry_email);

                // if (!empty($request_data['stripeToken'])) {
                //     $charge_details['source'] = $request_data['stripeToken'];
                // } else {

                    $first_name = (isset($request_data['first_name']) && !empty($request_data['first_name'])) ? $request_data['first_name'] : '';
                    $last_name = (isset($request_data['last_name']) && !empty($request_data['last_name'])) ? $request_data['last_name'] : '';

                    if($card_holder_name != '') {
                        $stripe_display_name = $card_holder_name;
                    }
                    else if ($first_name != '' && $last_name != '') {
                        $stripe_display_name = $first_name . " " . $last_name;
                    } else {
                        $stripe_display_name = sanitize_user($entry_email);
                    }

                    $charge_details['card'] = array(
                        "number" => $card_number,
                        "exp_month" => $exp_month,
                        "exp_year" => $exp_year,
                        "cvc" => $cvc,
                        'name' => $stripe_display_name,
                        'email' => sanitize_user($entry_email),
                        'address_line1' => '',
                        'address_line2' => '',
                        'address_city' => '',
                        'address_zip' => '',
                        'address_state' => '',
                        'address_country' => '',
                    );
                //}
                $charge_details['email'] = sanitize_user($entry_email);
                $extraParam['arm_is_trial'] = '1';
                $charge_details['extraVars'] = $extraParam;
            }

            do_action('arm_payment_log_entry', 'stripe', 'return charge details for single payment', 'armember', $charge_details, $arm_debug_payment_log_id); 
            return $charge_details;
        }

        function arm_payment_gateway_form_submit_action($payment_gateway, $payment_gateway_options, $posted_data, $entry_id){
            global $wpdb, $ARMember, $arm_global_settings, $payment_done, $paid_trial_stripe_payment_done, $arm_payment_gateways, $arm_membership_setup, $arm_subscription_plans, $arm_manage_communication, $arm_transaction, $arm_debug_payment_log_id, $arm_pro_ration_feature;

            $general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
            $arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
            //$arm_stripe_amount_multiply = str_pad(1, $arm_currency_decimal, 0, STR_PAD_RIGHT);
            $arm_stripe_amount_multiply = 100;

            if($payment_gateway == "stripe"){

                $arm_debug_log_data = array(
                    'payment_gateway' => $payment_gateway,
                    'gateway_options' => $payment_gateway_options,
                    'posted_data' => $posted_data,
                    'entry_id' => $entry_id,
                );
                do_action('arm_payment_log_entry', 'stripe', 'Submit payment form args', 'armember', $arm_debug_log_data, $arm_debug_payment_log_id); 
                
                $arm_return_data = array();
                $arm_return_data = apply_filters('arm_calculate_payment_gateway_submit_data', $arm_return_data, $payment_gateway, $payment_gateway_options, $posted_data, $entry_id);

                do_action('arm_payment_log_entry', 'stripe', 'Payment form submit data', 'armember', $arm_return_data, $arm_debug_payment_log_id); 

                $entry_data = $arm_return_data['arm_entry_data'];

                $entry_email = $arm_return_data['arm_user_email'];
                $posted_data['entry_email'] = $entry_email;
                $posted_data['entry_id'] = $entry_id;

                $user_id = $entry_data['arm_user_id'];
                $setup_id = $posted_data['setup_id'];
                $entry_values = maybe_unserialize($entry_data['arm_entry_value']);
                
                $arm_pro_rata_return_data = !empty($entry_data['arm_return_data'] ) ? maybe_unserialize( $entry_data['arm_return_data'] ) : array();

                $arm_user_old_plan = (!empty($entry_values['arm_user_old_plan'])) ? explode(',', $entry_values['arm_user_old_plan']) : array();

                $posted_data['tax_percentage'] = $tax_percentage = !empty($entry_values['tax_percentage']) ? $entry_values['tax_percentage'] : 0;

                $posted_data['arm_user_old_plan_ids'] = $arm_user_old_plan;

                $payment_cycle = $entry_values['arm_selected_payment_cycle'];

                $setup_detail = $arm_membership_setup->arm_get_membership_setup($setup_id);

                $plan_id = !empty($arm_return_data['arm_plan_id']) ? $arm_return_data['arm_plan_id'] : 0;
                $plan = !empty($arm_return_data['arm_plan_obj']) ? $arm_return_data['arm_plan_obj'] : array();
                if(empty($plan_id)){
                    $plan_id = (!empty($posted_data['_subscription_plan'])) ? $posted_data['_subscription_plan'] : 0;
                    $plan = ($arm_pro_ration_feature->isProRationFeature && !empty($arm_return_data['arm_plan_obj'])) ? $arm_return_data['arm_plan_obj'] : new ARM_Plan($plan_id);
                }

                $arm_plan_is_recurring = $plan->is_recurring();

                if (isset($plan->options['payment_cycles']) && !empty($plan->options['payment_cycles'])) {
                    $payment_cycle_key = !empty($plan->options['payment_cycles'][$payment_cycle]['cycle_key']) ? $plan->options['payment_cycles'][$payment_cycle]['cycle_key'] : $payment_cycle ;
                    if (!empty($setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id])) {
                        if (is_array($setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id])) {
                            if (isset($setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id][$payment_cycle_key])) {
                                $stripePlanID = $setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id][$payment_cycle_key];
                            } else {
                                $stripePlanID = '';
                            }
                        } else {
                            $stripePlanID = $setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id];
                        }
                        $posted_data['stripePlanID'] = $stripePlanID;
                    } else {
                        $posted_data['stripePlanID'] = '';
                    }
                } else {
                    if (!empty($setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id])) {
                        if (is_array($setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id])) {
                            $stripePlanID = $setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id]['arm0'];
                        } else {
                            $stripePlanID = $setup_detail['setup_modules']['modules']['stripe_plans'][$plan_id];
                        }
                        $posted_data['stripePlanID'] = $stripePlanID;
                    } else {
                        $posted_data['stripePlanID'] = '';
                    }
                }

                if ($arm_plan_is_recurring) {
                    $payment_mode = !empty($arm_return_data['arm_payment_mode']) ? $arm_return_data['arm_payment_mode'] : 'manual_subscription';
                } else {
                    $payment_mode = '';
                }

                $plan_action = !empty($arm_return_data['arm_plan_action']) ? $arm_return_data['arm_plan_action'] : 'new_subscription';
                $plan_expiry_date = !empty($arm_return_data['arm_plan_expiry_date']) ? $arm_return_data['arm_plan_expiry_date'] : "now";

                if ($payment_mode == 'auto_debit_subscription') {
                    if ($arm_plan_is_recurring) {
                        if ($plan_action == 'new_subscription') {
                            if (!($plan->is_support_stripe($payment_cycle))) {
                                $err_msg = esc_html__('Payment through Stripe is not supported for selected plan.', 'ARMember');
                                return $payment_done = array('status' => FALSE, 'error' => $err_msg);
                            }
                        } else {
                            if (!($plan->is_support_stripe_without_trial($payment_cycle))) {
                                $err_msg = esc_html__('Payment through Stripe is not supported for selected plan.', 'ARMember');
                                return $payment_done = array('status' => FALSE, 'error' => $err_msg);
                            }
                        }
                    }
                }


                // Charge Details Code Started
                //-------------------------------------------------------------

                    $charge_details = array();
                    $currency = $arm_payment_gateways->arm_get_global_currency();
                    $zero_demial_currencies = $arm_payment_gateways->arm_stripe_zero_decimal_currency_array();

                    $stripe_card_detail = isset($posted_data['stripe']) ? $posted_data['stripe'] : array();

                    $card_holder_name = isset( $stripe_card_detail['card_holder_name'] ) ? $stripe_card_detail['card_holder_name'] : '';
                    $card_number = isset($stripe_card_detail['card_number']) ? $stripe_card_detail['card_number'] : '';
                    $exp_month = isset($stripe_card_detail['exp_month']) ? $stripe_card_detail['exp_month'] : '';
                    $exp_year = isset($stripe_card_detail['exp_year']) ? $stripe_card_detail['exp_year'] : '';
                    $cvc = isset($stripe_card_detail['cvc']) ? $stripe_card_detail['cvc'] : '';

                    $arm_is_trial = '0';

                    $formSlug = isset($posted_data['arm_action']) ? $posted_data['arm_action'] : '';

                    $form = new ARM_Form('slug', $formSlug);

                    if($arm_plan_is_recurring){
                        $recurring_data = $arm_return_data['arm_recurring_data'];
                        $amount = str_replace(",", "", $recurring_data['amount']);
                    }else{
                        $amount = str_replace(",", "", $plan->amount);
                    }

                    $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');

                    $maskCCNum = $arm_transaction->arm_mask_credit_card_number($card_number);

                    $extraParam = array('card_number' => $maskCCNum, 'plan_amount' => $amount, 'paid_amount' => $amount);


                    // Coupon Data Calculation
                    //-------------------------
                        $discount_amt = $coupon_amount = $arm_coupon_on_each_subscriptions = $arm_coupon_discount = 0;
                        $coupon_code = $arm_coupon_discount_type_default = $arm_coupon_discount_type = '';

                        $coupon_details = array();

                        $arm_coupon_data = !empty($arm_return_data['arm_coupon_data']) ? $arm_return_data['arm_coupon_data'] : array();

                        if( !empty($arm_coupon_data) ){

                            $coupon_code = !empty($arm_coupon_data['arm_coupon_code']) ? $arm_coupon_data['arm_coupon_code'] : '';
                            $coupon_amount = !empty($arm_coupon_data['coupon_amt']) ? $arm_coupon_data['coupon_amt'] : 0;
                            $discount_amt = !empty($arm_coupon_data['total_amt']) ? $arm_coupon_data['total_amt'] : 0;
                            $discount_amt = str_replace(",", "", $discount_amt);

                            $arm_coupon_on_each_subscriptions =  !empty($arm_coupon_data['arm_coupon_on_each_subscriptions']) ? $arm_coupon_data['arm_coupon_on_each_subscriptions'] : '0';

                            $arm_coupon_discount_type_default = !empty($arm_coupon_data['discount_type']) ? $arm_coupon_data['discount_type'] : '';

                            $arm_coupon_discount = !empty($arm_coupon_data['discount']) ? $arm_coupon_data['discount'] : 0;

                            $global_currency = $arm_payment_gateways->arm_get_global_currency();
                            $arm_coupon_discount_type = ($arm_coupon_data['discount_type'] != 'percentage') ? $global_currency : "%";

                            $extraParam['coupon'] = array(
                                'coupon_code' => $coupon_code,
                                'amount' => $coupon_amount,
                            );

                            $coupon_details = array(
                                'coupon_code' => $coupon_code,
                                'arm_coupon_discount' => $arm_coupon_discount,
                                'arm_coupon_discount_type' => $arm_coupon_discount_type,
                                'arm_coupon_discount_type_default' => $arm_coupon_discount_type_default,
                                'arm_coupon_on_each_subscriptions' => $arm_coupon_on_each_subscriptions,
                                'amount' => $coupon_amount,
                            );

                            $extraParam['coupon'] = $coupon_details;

                            if( ( !empty($arm_return_data['arm_is_prorated']) && $arm_coupon_on_each_subscriptions != '0') ) 
                            {
                                $charge_details['coupon_details'] = $coupon_details;
                            }
                            else if( empty($arm_return_data['arm_is_prorated']) ) {
                                
                                $charge_details['coupon_details'] = $coupon_details;
                            }
                            
                        }else{
                            $posted_data['arm_coupon_code'] = '';
                        }

                    //-------------------------

                    $tax_display_type = !empty($arm_return_data['arm_tax_data']['arm_tax_include_exclude_flag']) ? $arm_return_data['arm_tax_data']['arm_tax_include_exclude_flag'] : 0;
                    if($payment_mode == 'auto_debit_subscription'){
                        $stripePlanID = $posted_data['stripePlanID'];

                        if (!empty($stripePlanID)) {
                            $charge_details['plan'] = $stripePlanID;
                        }

                        if($amount > 0 && $arm_coupon_on_each_subscriptions == 1){
                            $amount = !empty($arm_return_data['arm_coupon_amount_on_each_subs']) ? $arm_return_data['arm_coupon_amount_on_each_subs'] : 0;
                        }
                        if( empty($arm_return_data['arm_is_prorated']) ) {
                            $arm_hook_return_type = "amount";
                            $amount = apply_filters('arm_modify_membership_plan_amount_external', $amount, $arm_hook_return_type, $user_id,$plan_id, $payment_cycle,$plan,$entry_id);
                        }

                        $arm_tax_data = !empty($arm_return_data['arm_tax_data']) ? $arm_return_data['arm_tax_data'] : array();
                        if(!empty($arm_tax_data) && empty($arm_return_data['arm_is_prorated'])){
                            if(empty($tax_display_type))
                            {
                                $extraParam['arm_tax_include_exclude_flag'] = 0;
                                $tax_amount = $arm_tax_data['tax_amount'];
                                $amount = $arm_tax_data['tax_final_amount'];
                                $tax_amount = $arm_payment_gateways->arm_amount_set_separator($currency, $tax_amount);
                            }
                            else
                            {
                                $extraParam['arm_tax_include_exclude_flag'] = 1;
                                $tax_amount = $arm_membership_setup->arm_calculate_included_tax($amount,$tax_percentage);
                                $tax_amount = number_format((float)$tax_amount, $arm_currency_decimal, '.','');
                            }
                            $charge_details['tax_amount'] = $tax_amount;
                        }

                        $amount = apply_filters("arm_update_coupon_discount_amount_external", $amount, $coupon_amount, $discount_amt );
                        
                        $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');

                        $extraParam['paid_amount'] = $amount;

                        $rec_opt = !empty($arm_return_data['arm_recurring_data']) ? $arm_return_data['arm_recurring_data'] : array();
                        if ($arm_pro_ration_feature->isProRationFeature && (!empty($arm_return_data['arm_pro_rated_trial']) && !empty($rec_opt['trial']))) {
                            $allow_trial = true;
                            $arm_is_trial = '1';
                            $amount = $rec_opt['trial']['amount'];

                            $trial_amount = $rec_opt['trial']['amount'];
                            $trial_period = $rec_opt['trial']['period'];
                            $trial_interval = $rec_opt['trial']['interval'];
                            $extraParam['paid_amount'] = $trial_amount;
                            $extraParam['trial'] = array(
                                'amount' => $trial_amount,
                                'period' => $trial_period,
                                'interval' => $trial_interval,
                            );
                        } else {
                            $allow_trial = false;
                        }

                        if ($plan->has_trial_period() && $plan_action == 'new_subscription') {
                            if(empty($arm_coupon_on_each_subscriptions))
                            {
                                unset($charge_details['coupon_details']);
                            }
                        }
                    }
                    else if($payment_mode == 'manual_subscription'){
                        $rec_opt = !empty($arm_return_data['arm_recurring_data']) ? $arm_return_data['arm_recurring_data'] : array();
                        $allow_trial = true;
                        if (is_user_logged_in()) {
                            $user_id = get_current_user_id();
                            $user_plan = get_user_meta($user_id, 'arm_user_plan_ids', true);

                            if (!empty($user_plan) && empty($arm_return_data['arm_is_prorated'])) {
                                $allow_trial = false;
                            }
                        }                  

                        if ($plan->has_trial_period() && $allow_trial) {
                            $allow_trial = true;
                            $arm_is_trial = '1';
                            $amount = $rec_opt['trial']['amount'];

                            $trial_amount = $rec_opt['trial']['amount'];
                            $trial_period = $rec_opt['trial']['period'];
                            $trial_interval = $rec_opt['trial']['interval'];
                            $extraParam['trial'] = array(
                                'amount' => $trial_amount,
                                'period' => $trial_period,
                                'interval' => $trial_interval,
                            );
                        } else {
                            $allow_trial = false;
                        }

                        if (!empty($coupon_amount) && $coupon_amount > 0) {
                            $amount = $discount_amt;
                        }

                        if( empty($arm_return_data['arm_is_prorated']) && $arm_coupon_on_each_subscriptions != 1 ) {
                            $arm_hook_return_type = "amount";
                            $amount = apply_filters('arm_modify_membership_plan_amount_external', $amount, $arm_hook_return_type, $user_id,$plan_id, $payment_cycle,$plan,$entry_id);
                        }

                        if(empty($arm_return_data['arm_is_prorated']) && !empty($arm_return_data['arm_tax_data']))
                        {
                            if( empty( $tax_display_type ) )
                            {
                                $extraVars['arm_tax_include_exclude_flag'] = 0;
                                if($amount > 0 && $tax_percentage > 0 && $allow_trial){
                                    $amount = $arm_return_data['arm_tax_data']['final_trial_amount'];
                                    //$charge_details['tax_amount'] = $arm_return_data['arm_tax_data']['trial_tax_amount'];
                                } else if($amount > 0 && $tax_percentage > 0 && !$allow_trial ){
                                    $amount = $arm_return_data['arm_tax_data']['tax_final_amount'];
                                    //$charge_details['tax_amount'] = $arm_return_data['arm_tax_data']['tax_amount'];
                                }
                            }
                            if($allow_trial)
                            {
                                $charge_details['tax_amount'] = $arm_return_data['arm_tax_data']['trial_tax_amount'];
                            }
                            else
                            {
                                $charge_details['tax_amount'] = $arm_return_data['arm_tax_data']['tax_amount'];
                            }
                            if(!empty($tax_display_type) && $tax_percentage > 0)
                            {
                                $tax_amount = $amount - ( $amount/ (($tax_percentage/100)+1) );
                                $tax_amount = number_format((float)$tax_amount, $arm_currency_decimal, '.','');
                                $charge_details['tax_amount'] = $tax_amount;
                            }
                        }

                        $amount = str_replace(",", "", $amount);

                        $extraParam['paid_amount'] = $amount;

                        if (!empty($amount)) {
                            if (!in_array($currency, $zero_demial_currencies)) {
                                $amount = $amount * $arm_stripe_amount_multiply;
                                $amount = number_format($amount,0,".","");
                            }
                            else{
                                $amount = number_format((float) $amount, 0);
                                $amount = str_replace(",", "", $amount);
                            }
                        }
                        else {
                            $amount = "0.00";
                        }

                        $charge_details['amount'] = $amount;
                        $charge_details['currency'] = $currency;

                        if ($amount == 0 || $amount == '0.00') {
                            $return_array = array();
                            unset($extraParam['card_number']);
                            if (is_user_logged_in()) {
                                $current_user_id = get_current_user_id();
                                $return_array['arm_user_id'] = $current_user_id;
                                $arm_user_info = get_userdata($current_user_id);
                                $return_array['arm_first_name']=$arm_user_info->first_name;
                                $return_array['arm_last_name']= $arm_user_info->last_name;
                            }else{
                                $return_array['arm_first_name']=(isset($request_data['first_name']))?$request_data['first_name']:'';
                                $return_array['arm_last_name']=(isset($request_data['last_name']))?$request_data['last_name']:'';
                            }
                            $return_array['arm_plan_id'] = $plan->ID;
                            $return_array['arm_payment_gateway'] = 'stripe';
                            $return_array['arm_payment_type'] = $plan->payment_type;
                            $return_array['arm_token'] = '-';
                            $return_array['arm_payer_email'] = $entry_email;
                            $return_array['arm_receiver_email'] = '';
                            $return_array['arm_transaction_id'] = '-';
                            $return_array['arm_transaction_payment_type'] = $plan->payment_type;
                            $return_array['arm_transaction_status'] = 'completed';
                            $return_array['arm_payment_mode'] = $payment_mode;
                            $return_array['arm_payment_date'] = current_time( 'mysql' );
                            $return_array['arm_amount'] = 0;
                            $return_array['arm_currency'] = $currency;
                            $return_array['arm_coupon_code'] = @$coupon_code;
                            $return_array['arm_coupon_discount'] = @$arm_coupon_discount;
                            $return_array['arm_coupon_discount_type'] = @$arm_coupon_discount_type;
                            $return_array['arm_extra_vars'] = maybe_serialize($extraParam);
                            $return_array['arm_is_trial'] = $arm_is_trial;
                            $return_array['arm_created_date'] = current_time('mysql');
                            $return_array['arm_coupon_on_each_subscriptions'] = $arm_coupon_on_each_subscriptions;
                            $payment_log_id = $arm_payment_gateways->arm_save_payment_log($return_array);
                            do_action('arm_after_stripe_free_manual_payment', $plan, $payment_log_id, $arm_is_trial, @$coupon_code, $extraParam);
                            $charge_details['status'] = TRUE;
                            $charge_details['log_id'] = $payment_log_id;
                            //return array('status' => TRUE, 'log_id' => $payment_log_id, 'entry_id' => $entry_id);
                        }
                    }
                    else{
                        if (!empty($coupon_amount) && $coupon_amount > 0) {
                            $amount = $discount_amt;
                        }                       
                        if( empty($arm_return_data['arm_is_prorated']) && $arm_coupon_on_each_subscriptions != 1) {
                            $arm_hook_return_type = "amount";
                            $amount = apply_filters('arm_modify_membership_plan_amount_external', $amount, $arm_hook_return_type, $user_id,$plan_id, $payment_cycle,$plan,$entry_id);
                        }

                        $amount = str_replace(",", "", $amount);

                        $arm_tax_data = !empty($arm_return_data['arm_tax_data']) ? $arm_return_data['arm_tax_data'] : array();
                        if(!empty($arm_tax_data) && empty($arm_return_data['arm_is_prorated']) ){
                            if( empty( $tax_display_type ) )
                            {
                                $extraParam['arm_tax_include_exclude_flag'] = 0;
                                $tax_amount = $arm_tax_data['tax_amount'];
                                $amount = $arm_tax_data['tax_final_amount'];
                                $tax_amount = $arm_payment_gateways->arm_amount_set_separator($currency, $tax_amount);
                            }
                            else
                            {
                                $extraParam['arm_tax_include_exclude_flag'] = 1;
                                $tax_amount = $arm_membership_setup->arm_calculate_included_tax($amount,$tax_percentage);
                                $tax_amount = number_format((float)$tax_amount, $arm_currency_decimal, '.','');
                            }
                            $charge_details['tax_amount'] = $tax_amount;
                        }

                        $amount = number_format((float) $amount, $arm_currency_decimal, '.', '');

                        $extraParam['paid_amount'] = $amount;

                        if (!empty($amount)) {
                            if (!in_array($currency, $zero_demial_currencies)) {
                                $amount = $amount * $arm_stripe_amount_multiply;
                                $amount = number_format($amount,0,".","");
                            }
                            else{
                                $amount = number_format((float) $amount, 0);
                                $amount = str_replace(",", "", $amount);
                            }
                        } else {
                            $amount = "0";
                        }

                        $charge_details['amount'] = $amount;
                        $charge_details['currency'] = $currency;


                        if ($amount == 0 || $amount == '0.00') {
                            $return_array = array();
                            unset($extraParam['card_number']);
                            if (is_user_logged_in()) {
                                $current_user_id = get_current_user_id();
                                $return_array['arm_user_id'] = $current_user_id;
                                $arm_user_info = get_userdata($current_user_id);
                                $return_array['arm_first_name']=$arm_user_info->first_name;
                                $return_array['arm_last_name']=$arm_user_info->last_name;
                            }else{
                                $return_array['arm_first_name']=(isset($request_data['first_name']))?$request_data['first_name']:'';
                                $return_array['arm_last_name']=(isset($request_data['last_name']))?$request_data['last_name']:'';
                            }
                            $return_array['arm_plan_id'] = $plan->ID;
                            $return_array['arm_payment_gateway'] = 'stripe';
                            $return_array['arm_payment_type'] = $plan->payment_type;
                            $return_array['arm_token'] = '-';
                            $return_array['arm_payer_email'] = $entry_email;
                            $return_array['arm_receiver_email'] = '';
                            $return_array['arm_transaction_id'] = '-';
                            $return_array['arm_transaction_payment_type'] = $plan->payment_type;
                            $return_array['arm_transaction_status'] = 'completed';
                            $return_array['arm_payment_mode'] = '';
                            $return_array['arm_payment_date'] = current_time( 'mysql' );
                            $return_array['arm_amount'] = 0;
                            $return_array['arm_currency'] = $currency;
                            $return_array['arm_coupon_code'] = @$coupon_code;
                            $return_array['arm_coupon_discount'] = @$arm_coupon_discount;
                            $return_array['arm_coupon_discount_type'] = @$arm_coupon_discount_type;
                            $return_array['arm_extra_vars'] = maybe_serialize($extraParam);
                            $return_array['arm_is_trial'] = $arm_is_trial;
                            $return_array['arm_created_date'] = current_time('mysql');
                            $return_array['arm_coupon_on_each_subscriptions'] = $arm_coupon_on_each_subscriptions;
                            $payment_log_id = $arm_payment_gateways->arm_save_payment_log($return_array);
                            do_action('arm_after_stripe_free_payment', $plan, $payment_log_id, $arm_is_trial, @$coupon_code, $extraParam);
                            $charge_details['status'] = TRUE;
                            $charge_details['log_id'] = $payment_log_id;
                            //return array('status' => TRUE, 'log_id' => $payment_log_id, 'entry_id' => $entry_id);
                        }
                        if (isset($entry_email) && $entry_email != "") {
                            $charge_details['receipt_email'] = $entry_email;
                        }
                        if ($plan->name != "") {
                            $charge_details['description'] = $plan->name;
                        }
                    }

                    $custom_var = $entry_id . '|' . $entry_email . '|' . $form->ID . '|' . $plan->payment_type . '|' . $payment_mode;
                    $charge_details['metadata'] = array('custom' => $custom_var, 'tax_percentage' => $posted_data['tax_percentage'].'%','customer_email' => $entry_email);

                    $first_name = (isset($posted_data['first_name']) && !empty($posted_data['first_name'])) ? $posted_data['first_name'] : '';
                    $last_name = (isset($posted_data['last_name']) && !empty($posted_data['last_name'])) ? $posted_data['last_name'] : '';
                    if($card_holder_name != '') {
                        $stripe_display_name = $card_holder_name;
                    }
                    else if ($first_name != '' && $last_name != '') {
                        $stripe_display_name = $first_name . " " . $last_name;
                    } else {
                        $stripe_display_name = sanitize_user($entry_email);
                    }


                    $charge_details['card'] = array(
                        "number" => $card_number,
                        "exp_month" => $exp_month,
                        "exp_year" => $exp_year,
                        "cvc" => $cvc,
                        'name' => $stripe_display_name,
                        'email' => sanitize_user($entry_email),
                        'address_line1' => '',
                        'address_line2' => '',
                        'address_city' => '',
                        'address_zip' => '',
                        'address_state' => '',
                        'address_country' => '',
                    );

                    $charge_details['email'] = sanitize_user($entry_email);
                    $extraParam['arm_is_trial'] = $arm_is_trial;
                    $charge_details['extraVars'] = $extraParam;
                //-------------------------------------------------------------
                $arm_stripe_avail_payment_methods = array();
                $arm_stripe_avail_payment_methods = apply_filters( 'arm_get_available_stripe_payment_methods',$arm_stripe_avail_payment_methods);   
                
                if(!empty($posted_data['stripe_payment_method']) && !empty($arm_stripe_avail_payment_methods) && is_array($arm_stripe_avail_payment_methods) && array_key_exists($posted_data['stripe_payment_method'],$arm_stripe_avail_payment_methods))
                {
                    $payment_done = apply_filters( 'arm_stripe_process_other_payment_method', $posted_data, $arm_return_data, $payment_gateway, $payment_gateway_options, $charge_details,$entry_values,$entry_id);
                    return $payment_done;
                    exit;
                }
                if(!empty($payment_gateway_options['stripe_payment_method']) && ($payment_gateway_options['stripe_payment_method'] == "popup")){
                    global $arm_stripe_sca;
                    $arm_stripe_sca->arm_stripe_sca_form_render($posted_data, $arm_return_data, $payment_gateway, $payment_gateway_options, $charge_details);
                    
                    if( false == $payment_done['status'] || (isset( $payment_done['status2']) && true == $payment_done['status2'] ) ){
                        return $payment_done;
                    }
                    die;
                }

                $stripe_response = array();
                $stripe_error_msg = (isset($arm_global_settings->common_message['arm_payment_fail_stripe'])) ? $arm_global_settings->common_message['arm_payment_fail_stripe'] : esc_html__('Sorry something went wrong while processing payment with Stripe.', 'ARMember');
                $payment_done = array('status' => FALSE, 'error' => $stripe_error_msg, 'gateway' => 'stripe');
                if (!empty($charge_details)) {
                    $extraVars = array();
                    if (isset($charge_details['status']) && $charge_details['status'] == TRUE) {
                        $payment_done = $charge_details;
                        return $payment_done;
                    }
                    if (isset($charge_details['extraVars'])) {
                        $extraVars = $charge_details['extraVars'];
                        unset($charge_details['extraVars']);
                    }
                    $coupon_details = array();
                    if (isset($charge_details['coupon_details'])) {
                        $coupon_details = $charge_details['coupon_details'];
                    }
                    $charge_details['plan_action'] = $plan_action;
                    $charge_details['expire_date'] = $plan_expiry_date;

                    $charge_details['tax_percentage'] = $tax_percentage; 
                    $extraVars['tax_percentage'] = $tax_percentage;
                    $extraVars['tax_amount'] =  isset($charge_details['tax_amount'])? $charge_details['tax_amount'] : 0; 
                    unset($charge_details['tax_amount']);
                   //$plan = new ARM_Plan($plan_id);
                    $update_payment = false;
                    $stripe_response1 = $stripe_response = array();
                    if( ($plan_action == 'new_subscription' || $arm_pro_ration_feature->isProRationFeature) && $plan->is_recurring() && $payment_mode == 'auto_debit_subscription' && $plan->has_trial_period() ) {
                        $opt_trial = $plan->options['trial'];
                        $stripe_response1['message_error'] = array();

                        if ($opt_trial['amount'] > 0) {
                                $charge_details1 = self::arm_prepare_stripe_charge_details_for_single_payment($posted_data, $setup_id, $payment_cycle,$arm_return_data);

                            if (!empty($charge_details1)) {
                                $extraVars1 = array();
                                if (isset($charge_details1['extraVars'])) {
                                    $extraVars1 = $charge_details1['extraVars'];
                                    unset($charge_details1['extraVars']);
                                }

                                    $coupon_details = array();
                                if (isset($charge_details1['coupon_details'])) {
                                    $coupon_details = $charge_details1['coupon_details'];
                                    if(empty($charge_details1['coupon_details']['arm_coupon_on_each_subscriptions']))
                                    {
                                        unset($charge_details1['coupon_details']);
                                    }
                                }
                                unset($charge_details1['source']);
                                //$charge_details1['customer'] = $stripe_response->customer;
                                $extraVars1['tax_percentage'] = $charge_details1['tax_percentage'] = $tax_percentage;
                                $extraVars1['tax_amount'] =  isset($charge_details1['tax_amount'])? $charge_details1['tax_amount']  : 0; 
                                unset($charge_details1['tax_amount']);
                                if($charge_details1['amount'] > 0)
                                {
                                    $stripe_response1 = self::arm_StripePayment($charge_details1, $plan, $payment_mode, $arm_pro_rata_return_data);
                                    $update_payment = true;
                                }
                            } else {
                                $stripe_response1['message_error'] = (isset($arm_global_settings->common_message['arm_payment_fail_stripe'])) ? $arm_global_settings->common_message['arm_payment_fail_stripe'] : esc_html__('Sorry something went wrong while processing payment with Stripe.', 'ARMember');
                                
                            }
                        }
                        if (!empty($stripe_response1['message_error'])) {
                        
                            $payment_done = array('status' => FALSE, 'error' => $stripe_response1['message_error'], 'gateway' => 'stripe');
                            return $payment_done;
                        } else {

                            if(!empty($stripe_response1)){
                                
                                $stripe_response = self::arm_StripePayment($charge_details, $plan, $payment_mode, $arm_pro_rata_return_data);

                                if (!empty($stripe_response['message_error'])) {

                                    $payment_done = array('status' => FALSE, 'error' => $stripe_response['message_error'], 'gateway' => 'stripe');
                                }
                                else{
                                    $payment_log_id = self::arm_store_stripe_log($stripe_response, $plan_id, $user_id, $posted_data['entry_email'], $extraVars, $payment_mode, $coupon_details);
                                    sleep(2);
                                    $payment_done = array();
                                    if ($payment_log_id) {
                                        if( $update_payment ){
                                            self::arm_update_stripe_charge( $stripe_response1->id, $stripe_response->customer );
                                        }
                                        $payment_done = array('status' => TRUE, 'log_id' => $payment_log_id, 'entry_id' => $entry_id);

                                        if(!empty($coupon_details) && !empty($coupon_details["arm_coupon_on_each_subscriptions"])) {
                                            $payment_done["coupon_on_each"] = TRUE;
                                            $payment_done["trans_log_id"] = $payment_log_id;
                                        }
                                    }

                                    $payment_log_id1 = self::arm_store_stripe_log($stripe_response1, $plan_id, $user_id, $posted_data['entry_email'], $extraVars1, $payment_mode, $coupon_details);
                    
                                    $paid_trial_stripe_payment_done = array();
                                    if ($payment_log_id1) {
                                        $paid_trial_stripe_payment_done = array('status' => TRUE, 'log_id' => $payment_log_id1, 'entry_id' => $entry_id, 'gateway' => 'stripe');
                                        
                                    }
                                }                                    
                            }
                        }
                    }
                    else{

                        if($plan->is_recurring() && $payment_mode == 'auto_debit_subscription') {
                            $arm_selected_payment_plan = $posted_data['subscription_plan'];
                            $arm_selected_payment_cycle = $posted_data['payment_cycle_'.$arm_selected_payment_plan];
                            
                            $arm_subscribe_plan_cycles = array();
                            array_push($arm_subscribe_plan_cycles, $plan->options['payment_cycles'][$arm_selected_payment_cycle]);

                            $arm_new_stripe_subscribe_plans = $this->arm_stripe_get_stripe_plan($arm_selected_payment_plan, $arm_subscribe_plan_cycles);

                            $charge_details['plan'] = $arm_new_stripe_subscribe_plans[0];
                        }

                        $stripe_response = self::arm_StripePayment($charge_details, $plan, $payment_mode, $arm_pro_rata_return_data);

                        if (empty($stripe_response['message_error'])) {

                            if($plan->is_recurring() && $payment_mode == 'auto_debit_subscription') 
                            {
                                $arm_subscription_plan_options['arm_subscription_plan_options'] = $plan->arm_subscription_plan_options;
                            
                                //Update Plan Setup Configuration
                                $this->arm_update_stripe_configuration_setup($arm_selected_payment_plan, $arm_subscription_plan_options);
                            }

                        }
                        else
                        {
                            $payment_done = array('status' => FALSE, 'error' => $stripe_response['message_error'], 'gateway' => 'stripe');
                            return $payment_done;
                        }
                            if($plan_action=='recurring_payment')
                            {
                                $stripe_response['plan_action'] = 'recurring_subscription';
                            }

                            $payment_log_id = self::arm_store_stripe_log($stripe_response, $plan_id, $user_id, $posted_data['entry_email'], $extraVars, $payment_mode, $coupon_details);
                            sleep(2);
                            $payment_done = array();
                            if ($payment_log_id) {
                                $payment_done = array('status' => TRUE, 'log_id' => $payment_log_id, 'entry_id' => $entry_id);

                                if($plan_action=='renew_subscription' && !empty($coupon_details) && !empty($coupon_details["arm_coupon_on_each_subscriptions"]))
                                {
                                    $payment_done["coupon_on_each"] = TRUE;
                                    $payment_done["trans_log_id"] = $payment_log_id;
                                }
                                /*
                                else if($plan_action=='recurring_payment')
                                {
                                    do_action('arm_after_recurring_payment_success_outside', $user_id, $plan_id, 'stripe', $payment_mode, $user_subsdata);
                                }
                                */
                            }
                        
                    }
                }
            }
        }

        function arm_cancel_stripe_subscription($user_id, $plan_id) {
            global $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_member_forms, $arm_payment_gateways, $arm_manage_communication, $arm_subscription_cancel_msg, $arm_debug_payment_log_id;
            $arm_cancel_subscription_data = array();
            $arm_cancel_subscription_data = apply_filters('arm_gateway_cancel_subscription_data', $arm_cancel_subscription_data, $user_id, $plan_id, 'stripe', 'transaction_id', '', 'customer_id');
            
            if(!empty($arm_cancel_subscription_data)){
                do_action('arm_payment_log_entry', 'stripe', 'cancel subscription data', 'armember', $arm_cancel_subscription_data, $arm_debug_payment_log_id); 
                
                $arm_payment_mode = !empty($arm_cancel_subscription_data['arm_payment_mode']) ? $arm_cancel_subscription_data['arm_payment_mode'] : 'manual_subscription';

                $arm_subscr_id = !empty($arm_cancel_subscription_data['arm_subscr_id']) ? $arm_cancel_subscription_data['arm_subscr_id'] : '';
                $arm_customer_id = !empty($arm_cancel_subscription_data['arm_customer_id']) ? $arm_cancel_subscription_data['arm_customer_id'] : '';
                $arm_transaction_id = !empty($arm_cancel_subscription_data['arm_transaction_id']) ? $arm_cancel_subscription_data['arm_transaction_id'] : '';

                $arm_cancel_amount = !empty($arm_cancel_subscription_data['arm_cancel_amount']) ? $arm_cancel_subscription_data['arm_cancel_amount'] : 0;

                $stripe_options = $arm_cancel_subscription_data['payment_gateway_options'];

                if( isset( $stripe_options['stripe_payment_method'] ) && 'popup' == $stripe_options['stripe_payment_method'] ){
                    global $arm_stripe_sca;

                    $arm_stripe_sca->arm_cancel_stripe_sca_subscription($arm_cancel_subscription_data);
                    return;
                }

                if($arm_payment_mode == "auto_debit_subscription"){

                    if(!empty($arm_subscr_id)){
                        if (file_exists(MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php")) {
                            require_once (MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php");
                        }

                        if ($stripe_options['stripe_payment_mode'] == 'live') {
                            $apikey = $stripe_options['stripe_secret_key'];
                        } else {
                            $apikey = $stripe_options['stripe_test_secret_key'];
                        }

                        Stripe\Stripe::setApiKey($apikey);
                        Stripe\Stripe::setApiVersion($this->arm_stripe_api_version);

                        try {
                            $arm_stripe_obj = new \Stripe\StripeClient($apikey);
                            
                            $StripeAcion = $arm_stripe_obj->subscriptions->cancel($arm_subscr_id);
                            do_action('arm_payment_log_entry', 'stripe', 'cancel subscription response', 'armember', $StripeAcion, $arm_debug_payment_log_id); 

                            if((!empty($StripeAcion) && (empty($StripeAcion->status) || ($StripeAcion->status != "canceled"))) || empty($StripeAcion))
                            {
                                $common_messages = isset($arm_global_settings->common_message) ? $arm_global_settings->common_message : array();
                                $arm_subscription_cancel_msg = isset($common_messages['arm_payment_gateway_subscription_failed_error_msg']) ? $common_messages['arm_payment_gateway_subscription_failed_error_msg'] : esc_html__("Membership plan couldn't cancel. Please contact the site administrator.", 'ARMember');
                                return;
                            }
                        } catch (Exception $e) {
                            $errormsgchk = $e->getMessage();
                            if(strpos($errormsgchk, 'No such subscription:')===false)
                            {
                                do_action('arm_payment_log_entry', 'stripe', 'cancel subscription error', 'armember', $e->getMessage(), $arm_debug_payment_log_id); 
                                $arm_enable_debug_mode = isset($stripe_options['enable_debug_mode']) ? $stripe_options['enable_debug_mode'] : 0;
                                if($arm_enable_debug_mode)
                                {
                                    $arm_subscription_cancel_msg = esc_html__("Error in subscription cancel from Payment Gateway:", "ARMember")." ".$e->getMessage();
                                }
                                else
                                {
                                    $common_messages = isset($arm_global_settings->common_message) ? $arm_global_settings->common_message : array();
                                    $arm_subscription_cancel_msg = isset($common_messages['arm_payment_gateway_subscription_failed_error_msg']) ? $common_messages['arm_payment_gateway_subscription_failed_error_msg'] : esc_html__("Membership plan couldn't cancel. Please contact the site administrator.", 'ARMember');
                                }

                                return;
                            }
                        }

                    }
                }

                do_action('arm_cancel_subscription_payment_log_entry', $user_id, $plan_id, 'stripe', $arm_subscr_id, $arm_subscr_id, $arm_customer_id, $arm_payment_mode, $arm_cancel_amount);
            }
        }

        function arm_update_stripe_charge( $charge_id, $customer_id ){
            global $wpdb, $ARMember, $arm_payment_gateways, $arm_debug_payment_log_id;
            $all_payment_gateways = $arm_payment_gateways->arm_get_active_payment_gateways();

            $arm_debug_log_data = array(
                'charge_id' => $charge_id,
                'customer_id' => $customer_id,
            );
            do_action('arm_payment_log_entry', 'stripe', 'update charge data', 'armember', $arm_debug_log_data, $arm_debug_payment_log_id); 

            if( isset( $all_payment_gateways['stripe'] ) && !empty( $all_payment_gateways['stripe'] ) ){
                if( file_exists( MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php" ) ){
                    require_once( MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php" );
                }

                $apikey = "";
                $stripe_options = $all_payment_gateways['stripe'];
                if( "live" == $stripe_options['stripe_payment_mode'] ){
                    $apikey = $stripe_options['stripe_secret_key'];
                } else {
                    $apikey = $stripe_options['stripe_test_secret_key'];
                }
                
                

                $stripe_client = new \Stripe\StripeClient($apikey);
                Stripe\Stripe::setApiVersion($this->arm_stripe_api_version);

                $update_charge = $stripe_client->charges->update($charge_id, array(
                    'customer'=>$customer_id
                ));

                do_action('arm_payment_log_entry', 'stripe', 'update charge response', 'armember', $update_charge, $arm_debug_payment_log_id); 
            }
        }

        function arm_StripePayment($charge_details, $plan='', $payment_mode='manual_subscription', $arm_pro_rata_return_data=array() ) {

            global $wpdb, $ARMember, $arm_global_settings, $arm_member_forms, $arm_payment_gateways, $arm_debug_payment_log_id,$arm_pro_ration_feature;

            $general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
            $arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
            //$arm_stripe_amount_multiply = str_pad(1, $arm_currency_decimal, 0, STR_PAD_RIGHT);
            $arm_stripe_amount_multiply = 100;

            $arm_debug_log_data = $arm_debug_log_data_log = array(
                'charge_details' => $charge_details,
                'plan' => $plan,
                'payment_mode' => $payment_mode,
            );
            if(isset($arm_debug_log_data_log['charge_details']['card'])) 
            { 
                unset($arm_debug_log_data_log['charge_details']['card']);
            }
            do_action('arm_payment_log_entry', 'stripe', 'Payment Data', 'armember', $arm_debug_log_data_log, $arm_debug_payment_log_id); 

            $errors = array();
            $err_msg = (isset($arm_global_settings->common_message['arm_payment_fail_stripe'])) ? $arm_global_settings->common_message['arm_payment_fail_stripe'] : esc_html__('Sorry something went wrong while processing payment with Stripe.', 'ARMember');
            $all_payment_gateways = $arm_payment_gateways->arm_get_active_payment_gateways();
            if (isset($all_payment_gateways['stripe']) && !empty($all_payment_gateways['stripe'])) {
                if (file_exists(MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php")) {
                    require_once (MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php");
                }
                $apikey = "";
                $stripe_options = $all_payment_gateways['stripe'];
                $arm_stripe_enable_debug_mode = isset($stripe_options['enable_debug_mode']) ? $stripe_options['enable_debug_mode'] : 0;
                $arm_help_link = '<a href="https://stripe.com/docs/error-codes" target="_blank">'.esc_html__('Click Here', 'ARMember').'</a>';
                if ($stripe_options['stripe_payment_mode'] == 'live') {
                    $apikey = $stripe_options['stripe_secret_key'];
                } else {
                    $apikey = $stripe_options['stripe_test_secret_key'];
                }
                Stripe\Stripe::setApiKey($apikey);
                Stripe\Stripe::setApiVersion($this->arm_stripe_api_version);

                $plan_action = isset($charge_details['plan_action']) ? $charge_details['plan_action'] : 'new_subscription';
                $expire_date = isset($charge_details['expire_date']) ? $charge_details['expire_date'] : "now";
                $coupon_details = isset($charge_details['coupon_details']) ? $charge_details['coupon_details'] : array();
                $customer_email = isset($charge_details['email']) ? $charge_details['email'] : '';
                $tax_percentage = isset($charge_details['tax_percentage']) ? number_format((float)$charge_details['tax_percentage'], $arm_currency_decimal, '.',''): 0;
                unset($charge_details['expire_date']);
                unset($charge_details['plan_action']);
                unset($charge_details['coupon_details']);
                unset($charge_details['email']);
                unset($charge_details['tax_percentage']);

               try {
                    if (isset($charge_details['plan']) && !empty($charge_details['plan'])) {
                        if (isset($charge_details['source']) && !empty($charge_details['source'])) {
                            $cust_detail = array('source' => $charge_details['source']);
                            unset($charge_details['source']);
                        } else {
                            $cust_detail = array('card' => $charge_details['card']);
                            unset($charge_details['card']);
                        }
                        $cust_detail['email'] = $customer_email;
                        $cust_detail['name'] = $cust_detail['card']['name'];
                        if (class_exists('Stripe\Customer')) {
                            if (!empty($coupon_details)) {
                             
                                $coupon_code = $coupon_details['coupon_code'];
                                $coupon_discount_type = $coupon_details['arm_coupon_discount_type'];
                                $arm_coupon_on_each_subscriptions = isset($coupon_details['arm_coupon_on_each_subscriptions']) ? $coupon_details['arm_coupon_on_each_subscriptions'] : '0';
                                $coupon_duration = "once";
                                if(!empty($arm_coupon_on_each_subscriptions))
                                {
                                    $coupon_duration = "forever";
                                }
                                $stripe_coupon_details = array();
                                try {
                                    $stripe_coupon_details = Stripe\Coupon::retrieve($coupon_code);
                                } catch (Exception $ex) {
                                }

                                
                                if (!empty($stripe_coupon_details)) {

                                    $coupon_created_date = $stripe_coupon_details->created;
                                    $coupon_updated_date = $wpdb->get_var($wpdb->prepare("SELECT `arm_coupon_added_date` FROM  `$ARMember->tbl_arm_coupons` WHERE `arm_coupon_code` = %s", $coupon_code)); //phpcs:ignore --Reason $ARMember->tbl_arm_coupons is a table name
                                    if (strtotime($coupon_updated_date) > $coupon_created_date) {
                                        $stripe_coupon_details->delete();
                                        $stripe_coupon_details = array();
                                    }
                                }

                               
                                if (empty($stripe_coupon_details)) {
                                   
                                    $currency = $arm_payment_gateways->arm_get_global_currency();
                                    $create_coupon = array();
                                    try {
                                        if ($coupon_discount_type == '%') {
                                            $coupon_amount = str_replace(",", "", $coupon_details['arm_coupon_discount']);
                                            $coupon_amount = number_format((float) $coupon_amount, 0, '', '');
                                            $create_coupon = Stripe\Coupon::create(array(
                                                        "percent_off" => $coupon_amount,
                                                        "duration" => $coupon_duration,
                                                        "id" => $coupon_code)
                                            );
                                        } else {
                                            $coupon_amount = str_replace(",", "", $coupon_details['arm_coupon_discount']);
                                            $coupon_amount = number_format((float) $coupon_amount, $arm_currency_decimal, '.', '');
                                            if (!empty($coupon_amount)) {

                                                $zero_demial_currencies = $arm_payment_gateways->arm_stripe_zero_decimal_currency_array();
                                                if (!in_array($currency, $zero_demial_currencies)) {
                                                    $coupon_amount = $coupon_amount * $arm_stripe_amount_multiply;
                                                    $coupon_amount = number_format($coupon_amount,0,".","");
                                                }
                                                else{
                                                    $coupon_amount = number_format((float) $coupon_amount, 0);
                                                    $coupon_amount = str_replace(",", "", $coupon_amount);
                                                }
                                            }
                                            $create_coupon = Stripe\Coupon::create(array(
                                                        "amount_off" => $coupon_amount,
                                                        "duration" => $coupon_duration,
                                                        "id" => $coupon_code,
                                                        "currency" => $currency)
                                            );
                                        }
                                    } catch (Exception $ex) {
                                        
                                        if($arm_stripe_enable_debug_mode == '1')
                                        {
                                            $error_msg = $ex->getJsonBody();
                                            $actual_error = isset($error_msg['error']['message']) ? $error_msg['error']['message'] : '';
                                            $actual_error = !empty($actual_error) ? $actual_error.' '.$arm_help_link : esc_html__('coupon could not be applied', 'ARMember');
                                            $ARMember->arm_write_response( " Stripe Event Data Log 55 == coupon not applied == " . maybe_serialize($error_msg) );
                                            $errors['message_error'] = $actualmsg;
                                        } else {
                                            $errors['message_error'] = esc_html__('coupon could not be applied', 'ARMember');    
                                        }
                                        
                                        return $errors;
                                        $create_coupon = array();
                                    }
                                } else {
                                    $create_coupon = $stripe_coupon_details;
                                }
                            }

                            if(isset($cust_detail['card']['email'])) {
                                unset($cust_detail['card']['email']);
                            }

                            if ($plan_action == 'new_subscription' && $plan->is_recurring() && $payment_mode == 'auto_debit_subscription' && $plan->has_trial_period()) {
                                $opt_trial_days = $plan->options['trial']['days'];
                                $charge_details["trial_period_days"] = $opt_trial_days;
                            }
                            
                            $token = Stripe\Token::create(array("card" => $cust_detail['card']));
                            $request_token = $token->id;

                            $cust_detail['card'] = $request_token;

                            $new_cust = new \Stripe\StripeClient($apikey);
                            $customer_obj = $new_cust->customers->create($cust_detail);
                            $charge_details['customer'] = $customer_obj->id;

                            if ($plan_action == 'change_subscription') 
                            {
                                $charge_details["trial_end"] = "now";
                                if($arm_pro_ration_feature->isProRationFeature)
                                {
                                    if( !empty($arm_pro_rata_return_data) )
                                    {
                                        $charge_details["trial_end"] = $arm_pro_rata_return_data['arm_trial_end_date'];
                                    }
                                }
                            } else if ($plan_action == 'renew_subscription') {
                                $charge_details["trial_end"] = $expire_date;
                            }

                            if (!empty($coupon_details) && !empty($create_coupon)) {
                                $charge_details['coupon'] = $coupon_code;
                            }

                            if(!empty($tax_percentage) && empty($charge_details['extraVars']['arm_tax_include_exclude_flag'])){
                                //Create Tax Rate
                                $armCreateTax = $new_cust->taxRates->create([
                                    'display_name' => 'Tax',
                                    'inclusive' => false,
                                    'percentage' => $tax_percentage
                                ]);

                                $armTaxID = $armCreateTax->id;

                                $charge_details['default_tax_rates'] = array($armTaxID);
                            }

                            $charge = $new_cust->subscriptions->create($charge_details);

                            do_action('arm_payment_log_entry', 'stripe', 'Created Subscription Response', 'armember', $charge, $arm_debug_payment_log_id); 

                        } else {
                            $errors['message_error'] = $err_msg;
                            do_action('arm_payment_log_entry', 'stripe', 'Created Subscription Error', 'armember', $err_msg, $arm_debug_payment_log_id); 
                        }
                    } else {
                        if (class_exists('Stripe\Customer')) {
                            if(isset($charge_details['card']['email'])) {
                                unset($charge_details['card']['email']);
                            }

                            if( $plan->type != 'recurring' ){
                                if (isset($charge_details['source']) && !empty($charge_details['source'])) {
                                    $cust_detail = array('source' => $charge_details['source']);
                                    unset($charge_details['source']);
                                } else {
                                    $cust_detail = array('card' => $charge_details['card']);
                                    unset($charge_details['card']);
                                }
                                $token = Stripe\Token::create(array("card" => $cust_detail['card']));
                                $request_token = $token->id;

                                $cust_detail['card'] = $request_token;
                                $cust_detail['email'] = $customer_email;

                                $new_cust = new \Stripe\StripeClient($apikey);
                                $customer_obj = $new_cust->customers->create($cust_detail);
                                $charge_details['customer'] = $customer_obj->id;

                            } else {
                                $token = Stripe\Token::create(array("card" => $charge_details['card']));
                                $request_token = $token->id;
                                $charge_details['card'] = $request_token;
                            }

                            $new_cust = new \Stripe\StripeClient($apikey);
                            $charge = $new_cust->charges->create($charge_details);

                            do_action('arm_payment_log_entry', 'stripe', 'Completed payment details', 'armember', $charge, $arm_debug_payment_log_id); 
                            
                        } else {
                            do_action('arm_payment_log_entry', 'stripe', 'Completed Payment error', 'armember', $err_msg, $arm_debug_payment_log_id); 
                            $errors['message_error'] = $err_msg;
                        }
                    }
                } catch (Stripe\Error\Stripe_Card $e) {
                    $actual = $e->getJsonBody();
                    do_action('arm_payment_log_entry', 'stripe', 'Completed Payment error 2', 'armember', $actual, $arm_debug_payment_log_id);
                    $ARMember->arm_write_response("error1 ".maybe_serialize($actual));

                    $card_err_msg = '';
                    /* Since it's a decline, Stripe_CardError will be caught $body = $e->getJsonBody(); */
                    if (!empty($actual)) {
                        $actual_error = isset($actual['error']['message']) ? $actual['error']['message'] : '';
                        $actual_error = !empty($actual_error) ? $actual_error.' '.$arm_help_link : '';
                        if (isset($actual['error']['code']) && $actual['error']['code'] == 'card_declined') {
                            $card_err_msg = $arm_global_settings->common_message['arm_credit_card_declined'];
                            $card_err_msg = (!empty($card_err_msg)) ? $card_err_msg : esc_html__('Your Card is declined.', 'ARMember');
                        } else {
                            $card_err_msg = $arm_global_settings->common_message['arm_invalid_credit_card'];
                            $card_err_msg = (!empty($card_err_msg)) ? $card_err_msg : esc_html__('Please enter correct card details.', 'ARMember');
                        }
                    } else {
                        $card_err_msg = $arm_global_settings->common_message['arm_credit_card_declined'];
                        $card_err_msg = (!empty($card_err_msg)) ? $card_err_msg : esc_html__('Your Card is declined.', 'ARMember');
                    }
                    if($arm_stripe_enable_debug_mode == '1')
                    {
                        $errors['message_error'] = $actual_error;
                        $ARMember->arm_write_response( " Stripe Event Data Log 1 == " . maybe_serialize($actual) );
                    }
                    else
                    {
                        $errors['message_error'] = $card_err_msg;
                    }
                } catch (Stripe\Error\Stripe_InvalidRequest $e) {
                    $error_msg = $e->getJsonBody();
                    do_action('arm_payment_log_entry', 'stripe', 'Completed Payment Invalid Request Error', 'armember', $error_msg, $arm_debug_payment_log_id);
                    $actual_error = isset($error_msg['error']['message']) ? $error_msg['error']['message'] : '';
                    $arme_msg=(!empty($e->getMessage()))?$e->getMessage():'';
                    $actual_error = !empty($actual_error) ? $actual_error.' '.$arm_help_link : $arme_msg;                    

                    $actualmsg = ($arm_stripe_enable_debug_mode == '1') ? $actual_error : $err_msg;
                    if($arm_stripe_enable_debug_mode == '1') {
                        $ARMember->arm_write_response( " Stripe Event Data Log 2 == " . maybe_serialize($error_msg) );
                    }

                    /* Invalid parameters were supplied to Stripe's API  */
                    $errors['message_error'] = $actualmsg;
                } catch (Stripe\Error\Stripe_Authentication $e) {
                    $error_msg = $e->getJsonBody();
                    do_action('arm_payment_log_entry', 'stripe', 'Completed Payment Authentication error', 'armember', $error_msg, $arm_debug_payment_log_id);
                    $actual_error = isset($error_msg['error']['message']) ? $error_msg['error']['message'] : '' ;
                    $arme_msg=(!empty($e->getMessage()))?$e->getMessage():'';
                    $actual_error = !empty($actual_error) ? $actual_error.' '.$arm_help_link : $arme_msg;                    

                    $actualmsg = ($arm_stripe_enable_debug_mode == '1') ? $actual_error : $err_msg;
                    if($arm_stripe_enable_debug_mode == '1') {
                        $ARMember->arm_write_response( " Stripe Event Data Log 3 == " . maybe_serialize($error_msg) );
                    }
                 
                    /* Authentication with Stripe's API failed  */
                    /* (maybe you changed API keys recently) */
                    $errors['message_error'] = $actualmsg;
                } catch (Stripe\Error\Stripe_ApiConnection $e) {
                    $error_msg = $e->getJsonBody();
                    do_action('arm_payment_log_entry', 'stripe', 'Completed payment connection error', 'armember', $error_msg, $arm_debug_payment_log_id);
                    $actual_error = isset($error_msg['error']['message']) ? $error_msg['error']['message'] : '';
                    $arme_msg=(!empty($e->getMessage()))?$e->getMessage():'';
                    $actual_error = !empty($actual_error) ? $actual_error.' '.$arm_help_link : $arme_msg;                    

                    $actualmsg = ($arm_stripe_enable_debug_mode == '1') ? $actual_error : $err_msg;
                    if($arm_stripe_enable_debug_mode == '1') {
                        $ARMember->arm_write_response( " Stripe Event Data Log 4 == " . maybe_serialize($error_msg) );
                    }

                    /* Network communication with Stripe failed */
                    $errors['message_error'] = $actualmsg;
                } catch (Exception $e) {
                    $error_msg = $e->getJsonBody();
                    do_action('arm_payment_log_entry', 'stripe', 'Completed payment network communication error', 'armember', $error_msg, $arm_debug_payment_log_id);
                    $actual_error = isset($error_msg['error']['message']) ? $error_msg['error']['message'] : '';
                    $arme_msg=(!empty($e->getMessage()))?$e->getMessage():'';
                    $actual_error = !empty($actual_error) ? $actual_error.' '.$arm_help_link : $arme_msg;                    
                    
                    $actualmsg = ($arm_stripe_enable_debug_mode == '1') ? $actual_error : $err_msg;
                    if($arm_stripe_enable_debug_mode == '1') {
                        $ARMember->arm_write_response( " Stripe Event Data Log 5 == " . maybe_serialize($error_msg) );
                    }
                    /* Something else happened, completely unrelated to Stripe */
                    $errors['message_error'] = $actualmsg;
                }
            } else {
                $errors['message_error'] = $err_msg;
            }
            if (!empty($errors)) {
                return $errors;
            } else {
                if(isset($charge->status) && $charge->status=='incomplete')
                {
                    $errors['message_error'] = esc_html__('Your card required Stripe 3D authentication. Recommend to use Stripe SCA Method', 'ARMember');
                    return $errors;
                }
                else {
                    do_action('arm_payment_log_entry', 'stripe', 'Payment 3D authentication error', 'armember', $charge, $arm_debug_payment_log_id);
                    return $charge;
                }
                
            }
        }

        function arm_StripeEventListener() {
            global $wpdb, $ARMember, $arm_global_settings, $arm_member_forms, $arm_payment_gateways, $arm_subscription_plans, $arm_manage_communication, $arm_members_class, $arm_debug_payment_log_id;

            $general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
            $arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
            //$arm_stripe_amount_multiply = str_pad(1, $arm_currency_decimal, 0, STR_PAD_RIGHT);
            //$arm_stripe_amount_multiply = 100;

            /**
             * Need to set web-hook url like this (ie. http://sitename.com/?arm-listener=arm_stripe_api)
             */
            if (isset($_REQUEST['arm-listener']) && in_array($_REQUEST['arm-listener'], array('arm_stripe_api', 'arm_stripe_notify', 'stripe'))) {
                
                do_action('arm_payment_log_entry', 'stripe', 'webhook data', 'payment_gateway', $_REQUEST, $arm_debug_payment_log_id);
                 
                $all_payment_gateways = $arm_payment_gateways->arm_get_active_payment_gateways();
                if (isset($all_payment_gateways['stripe']) && !empty($all_payment_gateways['stripe'])) {

                    if (file_exists(MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php")) {
                        require_once (MEMBERSHIP_DIR . "/lib/Stripe/vendor/autoload.php");
                    }

                    $secret_key = "";
                    $stripe_options = $all_payment_gateways['stripe'];
                    if ($stripe_options['stripe_payment_mode'] == 'live') {
                        $secret_key = $stripe_options['stripe_secret_key'];
                    } else {
                        $secret_key = $stripe_options['stripe_test_secret_key'];
                    }
                    Stripe\Stripe::setApiVersion($this->arm_stripe_api_version);
                    $errors = array();

                    /* Retrieve the request's body and parse it as JSON */
                    $body = @file_get_contents('php://input');
                    /* Grab the event information */
                    $event_json = json_decode($body);

                    do_action('arm_payment_log_entry', 'stripe', 'webhook requested data', 'payment_gateway', $event_json, $arm_debug_payment_log_id);

                    /* Retrieve the event from Stripe request body */
                    $event_id = !empty($event_json->id) ? $event_json->id : '';
                    if (!empty($event_id)) {
                        $payment_data = array();
                        try {
                            /* to verify this is a real event, we re-retrieve the event from Stripe  */
                            //New API Request
                            $stripe_client_obj = new \Stripe\StripeClient($secret_key);
                            $event = $stripe_client_obj->events->retrieve($event_id);
                            $invoice = $event->data->object;
                            do_action('arm_payment_log_entry', 'stripe', 'webhook generated invoice data', 'payment_gateway', $invoice, $arm_debug_payment_log_id);
                            $customs = !empty($invoice->metadata->custom) ? explode('|', $invoice->metadata->custom) : array();
                            $entry_id = isset($customs[0]) ? $customs[0] : '' ;
                            $entry_email = isset($customs[1]) ? $customs[1] : '';
                            $subscription_id = $invoice->id; //Returns Subscription ID
                            $arm_transaction_id = !empty($invoice->latest_invoice) ? $invoice->latest_invoice : ''; //Returns Invoice ID


                            $arm_debug_log_data = array(
                                'custom_data' => $customs,
                                'entry_id' => $entry_id,
                                'entry_email' => $entry_email,
                                'subscription_id' => $subscription_id,
                                'transaction_id' => $arm_transaction_id,
                                'event_type' => $event->type,
                            );
                            do_action('arm_payment_log_entry', 'stripe', 'webhook submit data for entry', 'payment_gateway', $arm_debug_log_data, $arm_debug_payment_log_id);

                            if(!empty($arm_transaction_id) && (!empty($event->type) && $event->type != "customer.subscription.deleted"))
                            {
                                $payLog_data = $wpdb->get_row( $wpdb->prepare("SELECT `arm_user_id`, `arm_plan_id`, `arm_extra_vars` FROM `" . $ARMember->tbl_arm_payment_log . "` WHERE `arm_transaction_id`=%s AND `arm_payment_gateway`=%s AND arm_transaction_status != %s ORDER BY `arm_log_id` DESC",$arm_transaction_id,'stripe','failed'), ARRAY_A); //phpcs:ignore --Reason $ARMember->tbl_arm_payment_log is a table name

                                do_action('arm_payment_log_entry', 'stripe', 'webhook existing transaction data', 'payment_gateway', $payLog_data, $arm_debug_payment_log_id);

                                if(!empty($payLog_data))
                                {
                                    return;
                                }
                            }
                            
                            $payLog_data = $wpdb->get_row( $wpdb->prepare("SELECT `arm_user_id`, `arm_plan_id`, `arm_extra_vars` FROM `" . $ARMember->tbl_arm_payment_log . "` WHERE (`arm_transaction_id`=%s OR `arm_token`=%s) AND `arm_payment_gateway`=%s ORDER BY `arm_log_id` DESC",$subscription_id,$subscription_id,'stripe'), ARRAY_A); //phpcs:ignore --Reason $ARMember->tbl_arm_payment_log is a table name

                            do_action('arm_payment_log_entry', 'stripe', 'webhook existing subscription data', 'payment_gateway', $payLog_data, $arm_debug_payment_log_id);
                             
                            if (!empty($subscription_id) && !empty($payLog_data)) {
                                $payment_log_user_id = $payLog_data['arm_user_id'];
                                if(empty($payment_log_user_id))
                                {
                                    $get_user_id_by_subscription = $wpdb->get_row( $wpdb->prepare("SELECT * FROM ".$wpdb->usermeta." WHERE meta_value like %s",'%'.$subscription_id.'%'), ARRAY_A); //phpcs:ignore --Reason $wpdb->usermeta is a table name
                                    if(!empty($get_user_id_by_subscription))
                                    {
                                        $payment_log_user_id = $get_user_id_by_subscription['user_id'];
                                    }
                                }
                                
                                $user_info = get_user_by('ID', $payment_log_user_id);

                                $entry_plan = $payLog_data['arm_plan_id'];
                                $extraVars = $payLog_data['arm_extra_vars'];
                                $tax_percentage = $tax_amount = 0;
                                if(isset($extraVars) && !empty($extraVars)){
                                    $unserialized_extravars = maybe_unserialize($extraVars);
                                    $tax_percentage = (isset($unserialized_extravars['tax_percentage']) && $unserialized_extravars['tax_percentage'] != '' )? $unserialized_extravars['tax_percentage'] : 0;
                                }

                                if (!empty($user_info)) {
                                    $user_id = $user_info->ID;
                                    $userPlan = get_user_meta($user_id, 'arm_user_plan_ids', true);
                                    $userPlan = !empty($userPlan) ? $userPlan : array();

                                    $defaultPlanData = $arm_subscription_plans->arm_default_plan_array();
                                    $userPlanDatameta = get_user_meta($user_id, 'arm_user_plan_' . $entry_plan, true);
                                    $userPlanDatameta = !empty($userPlanDatameta) ? $userPlanDatameta : array();
                                    $planData = shortcode_atts($defaultPlanData, $userPlanDatameta);

                                    $payment_cycle = $planData['arm_payment_cycle'];
                                    $planDetail = $planData['arm_current_plan_detail'];
                                    $tax_amount = 0;

                                    $arm_subscription_plan_options =  !empty($planDetail['arm_subscription_plan_options']) ? maybe_unserialize( $planDetail['arm_subscription_plan_options'] ) : array(); //phpcs:ignore
                                    $arm_subscription_plan_options_payment_failed_action = !empty($arm_subscription_plan_options['payment_failed_action']) ? $arm_subscription_plan_options['payment_failed_action'] : 0;

                                    if (!empty($planDetail)) {
                                        $plan = new ARM_Plan(0);
                                        $plan->init((object) $planDetail);
                                        $plan_data = $plan->prepare_recurring_data($payment_cycle);
                                        $plan_amount = $plan_data['amount'];
                                        
                                        if($tax_percentage > 0 && $plan_amount != '') {
                                            $tax_amount = ($tax_percentage*$plan_amount)/100;
                                            $tax_amount = number_format((float)$tax_amount , $arm_currency_decimal, '.', '');
                                        }

                                    } else {
                                        $plan = new ARM_Plan($entry_plan);
                                        $recurring_data = $plan->prepare_recurring_data($payment_cycle);
                                        $plan_amount = $recurring_data['amount']; 
                                      
                                        if($tax_percentage > 0 && $plan_amount != ''){
                                            $tax_amount = ($tax_percentage*$plan_amount)/100;
                                            $tax_amount = number_format((float)$tax_amount , $arm_currency_decimal, '.', '');
                                        }
                                    }

                                    $payment_mode = $planData['arm_payment_mode'];
                                    $user_subsdata = $planData['arm_stripe'];
                                    if (in_array($entry_plan, $userPlan) || ( !empty($arm_subscription_plan_options_payment_failed_action) && in_array($arm_subscription_plan_options_payment_failed_action, $userPlan) )) {
                                        $invoice_failure_msg = !empty($invoice->failure_message) ? $invoice->failure_message : '';
                                        $invoice_failure_code = !empty($invoice->failure_code) ? $invoice->failure_code : '';
                                        $extraVars = array(
                                            'subs_id' => $invoice->customer,
                                            'trans_id' => $invoice->id,
                                            'error' => $invoice_failure_msg,
                                            'date' => current_time('mysql'),
                                            'message_type' => $event->type . '-' . $invoice_failure_code,
                                        );
                                        $extraVars['tax_percentage'] = $tax_percentage;
                                        $extraVars['tax_amount'] = $tax_amount;
                                        $arm_custom_event = '';
                                        $arm_custom_event = apply_filters('arm_stripe_payment_gateway_check_event', $arm_custom_event, $event->type ,$invoice,$stripe_client_obj);
                                        do_action('arm_payment_log_entry', 'stripe', 'Webhook Event', 'payment_gateway', "SubscriptionID=".$subscription_id." Event=".$event->type, $arm_debug_payment_log_id);
                                        switch ($event->type) {
                                            case 'invoice.payment_succeeded':
                                            case 'customer.subscription.updated':
                                            case $arm_custom_event:
                                                $arm_token = $subscription_id;
                                                $invoice = json_encode($invoice);
                                                $invoice = json_decode($invoice, TRUE);
                                                //$invoice = (array) $invoice;

                                                $arm_subscription_field_name = $arm_token_field_name = "id";
                                                $arm_transaction_id_field_name = "latest_invoice";
                                                
                                                do_action('arm_payment_log_entry', 'stripe', 'webhook data get event type & entry_id', 'payment_gateway', $event->type." entry ID:".$entry_id, $arm_debug_payment_log_id);

                                                if( 'customer.subscription.updated' == $event->type && empty($entry_id) ){
                                                    $customer_id = $event->data->object->customer;
                                                    $customer_data = $stripe_client_obj->customers->retrieve( $customer_id );
                                                    $customer_email = !empty( $customer_data->email ) ? $customer_data->email : '';

                                                    do_action('arm_payment_log_entry', 'stripe', 'webhook data get customer email', 'payment_gateway', $customer_email, $arm_debug_payment_log_id);

                                                    $getEntryId = $wpdb->get_row( $wpdb->prepare( "SELECT arm_entry_id FROM `". $ARMember->tbl_arm_entries . "` WHERE `arm_entry_email` = %s AND `arm_plan_id` = %d", $customer_email, $entry_plan ) ); //phpcs:ignore --Reason $ARMember->tbl_arm_entries is a table name

                                                    do_action('arm_payment_log_entry', 'stripe', 'webhook data get entry_id row from entries', 'payment_gateway', $getEntryId, $arm_debug_payment_log_id);

                                                    if( !empty( $getEntryId->arm_entry_id ) ){
                                                        $entry_id = $getEntryId->arm_entry_id;
                                                    }
                                                }

                                                $arm_webhook_save_membership_data = array();
                                                $arm_webhook_save_membership_data = apply_filters('arm_modify_payment_webhook_data', $arm_webhook_save_membership_data, $invoice, 'stripe', $arm_token, $arm_transaction_id, $entry_id, $arm_token, $arm_subscription_field_name, $arm_token_field_name, $arm_transaction_id_field_name);
                                                break;
                                            case 'customer.subscription.deleted':
                                            case 'subscription_schedule.canceled':
                                                $plan_cycle = isset($planData['arm_payment_cycle']) ? $planData['arm_payment_cycle'] : '';
                                                $paly_cycle_data = $plan->prepare_recurring_data($plan_cycle);
                                                
                                                //Check Subscription ID in usermeta and then after cancel it.
                                                
                                                $arm_debug_log_data = array(
                                                    'cancel_rec_time' => $paly_cycle_data['rec_time'],
                                                    'cancel_plan_action' => $plan->options['cancel_plan_action'],
                                                    'entry_plan' => $entry_plan,
                                                    'user_id' => $user_id,
                                                );

                                                if($plan->options['cancel_plan_action'] != "on_expire")
                                                {
                                                     $arm_subscription_plans->arm_add_membership_history($user_id, $entry_plan, 'cancel_subscription');
                            
                                                    //do_action('arm_cancel_subscription', $user_id, $entry_plan);
                                                    $arm_subscription_plans->arm_clear_user_plan_detail($user_id, $entry_plan);
                                                

                                                    $cancel_plan_act = isset($plan->options['cancel_action']) ? $plan->options['cancel_action'] : 'block';
                                                    if ($arm_subscription_plans->isPlanExist($cancel_plan_act)) {
                                                        $arm_members_class->arm_new_plan_assigned_by_system($cancel_plan_act, $entry_plan, $user_id);
                                                    }
                                                    $arm_manage_communication->arm_user_plan_status_action_mail(array('plan_id' => $entry_plan, 'user_id' => $user_id, 'action' => 'on_cancel_subscription'));
                                                    $payment_log_id = self::arm_store_stripe_log($invoice, $entry_plan, $user_id, $entry_email, $extraVars, $payment_mode);
                                                }
                                                else if($plan->options['cancel_plan_action'] == "on_expire")
                                                {
                                                    $planData['arm_cencelled_plan'] = 'yes';
                                                    update_user_meta($user_id, 'arm_user_plan_' . $entry_plan, $planData);
                                                }

                                                do_action('arm_payment_log_entry', 'stripe', 'webhook cancel subscription', 'payment_gateway', $arm_debug_log_data, $arm_debug_payment_log_id);
                                                break;
                                            case 'invoice.payment_failed':
                                            case 'order.payment_failed':

                                                delete_transient("arm_stripe_trans".$arm_transaction_id);

                                                $arm_debug_log_data = array(
                                                    'plan_id' => $entry_plan,
                                                    'user_id' => $user_id,
                                                );
                                                do_action('arm_payment_log_entry', 'stripe', 'webhook order payment field', 'payment_gateway', $arm_debug_log_data, $arm_debug_payment_log_id);

                                                $arm_transaction_id = !empty($invoice->id) ? $invoice->id : '';
                                                $arm_success_payment_record = $wpdb->get_row( $wpdb->prepare("SELECT arm_log_id FROM `" . $ARMember->tbl_arm_payment_log . "` WHERE `arm_transaction_id`=%s AND `arm_transaction_id`!=%s AND `arm_payment_gateway`=%s AND arm_transaction_status = %s ORDER BY `arm_log_id` DESC",$arm_transaction_id,'','stripe','success'), ARRAY_A); //phpcs:ignore --Reason $ARMember->tbl_arm_payment_log is table name
                                                if(!empty($arm_success_payment_record)){
                                                    $arm_current_date_time = current_time('timestamp');
                                                    $arm_user_meta_data = get_user_meta($user_id, 'arm_user_plan_'.$entry_plan, true);
                                                    if(!empty($arm_user_meta_data)){
                                                        $arm_user_meta_data['arm_next_due_payment'] = $arm_current_date_time;
                                                        $arm_user_meta_data['arm_completed_recurring'] = $arm_user_meta_data['arm_completed_recurring']-1;
                                                        $arm_is_user_in_grace = isset($arm_user_meta_data['arm_is_user_in_grace']) ? $arm_user_meta_data['arm_is_user_in_grace'] : 0;
                                                        //$arm_grace_period_end = isset($arm_user_meta_data['arm_grace_period_end']) ? $arm_user_meta_data['arm_grace_period_end'] : '';
                                                        /* 
                                                        if($arm_is_user_in_grace>0)
                                                        {
                                                            $arm_user_meta_data['arm_grace_period_end'] = $arm_current_date_time;
                                                        } 
                                                        */

                                                        update_user_meta($user_id, 'arm_user_plan_'.$entry_plan, $arm_user_meta_data);
                                                    }

                                                    $arm_new_transaction_id = $arm_transaction_id." - ".esc_html__('Failed', 'ARMember');
                                                    $wpdb->update($ARMember->tbl_arm_payment_log, array('arm_transaction_status' => 'failed', 'arm_transaction_id' => $arm_new_transaction_id), array('arm_log_id' => $arm_success_payment_record['arm_log_id']));
                                                }

                                                $arm_subscription_plans->arm_user_plan_status_action(array('plan_id' => $entry_plan, 'user_id' => $user_id, 'action' => 'failed_payment'), true);
                                                $invoice->status = 'failed';
                                                $arm_manage_communication->arm_user_plan_status_action_mail(array('plan_id' => $entry_plan, 'user_id' => $user_id, 'action' => 'failed_payment'));
                                                //$payment_log_id = self::arm_store_stripe_log($invoice, $entry_plan, $user_id, $entry_email, $extraVars, $payment_mode);
                                                do_action('arm_after_recurring_payment_failed_outside', $user_id, $entry_plan, 'stripe', $payment_mode, $user_subsdata);
                                                break;
                                            default:
                                                do_action('arm_handle_stripe_unknown_error_from_outside', $user_id, $entry_plan, $extraVars['message_type']);
                                                break;
                                        }
                                    }
                                }
                            }
                            $arm_stripe_event_succeed = apply_filters( 'arm_stripe_checkout_event_succeed', $event,$invoice ,$stripe_client_obj);
                        } catch (Exception $e) {
                            do_action('arm_payment_log_entry', 'stripe', 'error in webhook data verification', 'payment_gateway', $e->getMessage(), $arm_debug_payment_log_id);
                        }
                    }
                }
                echo "200 OK";
                exit;
            }
            return;
        }

        function arm_store_stripe_log($stripe_response = '', $plan_id = 0, $user_id = 0, $payer_email = '', $extraVars = array(), $payment_mode = '', $coupon_details = array()) {
            global $wpdb, $ARMember, $arm_global_settings, $arm_member_forms, $arm_payment_gateways,$arm_membership_setup, $arm_debug_payment_log_id;

            $general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
            $arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;

            $tax_display_type= !empty($general_settings['arm_tax_include_exclude_flag']) ? $general_settings['arm_tax_include_exclude_flag'] : 0;
            //$arm_stripe_amount_multiply = str_pad(1, $arm_currency_decimal, 0, STR_PAD_RIGHT);
            $arm_stripe_amount_multiply = 100;

            $arm_debug_log_data = array(
                'stripe_response' => $stripe_response,
                'plan_id' => $plan_id,
                'user_id' => $user_id,
                'payer_email' => $payer_email,
                'extraVars' => $extraVars,
                'payment_mode' => $payment_mode,
                'coupon_details' => $coupon_details,
            );
            do_action('arm_payment_log_entry', 'stripe', 'store payment args', 'armember', $arm_debug_log_data, $arm_debug_payment_log_id);

            if (!empty($stripe_response)) {
                $custom_var = !empty($stripe_response->metadata->custom) ? $stripe_response->metadata->custom : '';
                $customs = explode('|', $custom_var);
                $entry_id = $customs[0];
                $entry_email = $customs[1];
                $form_id = $customs[2];
                $arm_payment_type = $customs[3];
                $tax_percentage = isset($stripe_response->metadata->tax_percentage) ? $stripe_response->metadata->tax_percentage : 0;
                $zero_demial_currencies = $arm_payment_gateways->arm_stripe_zero_decimal_currency_array();

                $arm_transaction_id = $stripe_response->id;
                $arm_is_trial = 0;
                $coupon_code = '';
                $coupon_discount = 0;
                $coupon_discount_type = '';
                $arm_coupon_on_each_subscriptions = '0';
                if (isset($coupon_details) && !empty($coupon_details)) {
                    $coupon_code = $coupon_details['coupon_code'];
                    $coupon_discount = $coupon_details['arm_coupon_discount'];
                    $coupon_discount_type = $coupon_details['arm_coupon_discount_type'];
                    $arm_coupon_on_each_subscriptions = isset($coupon_details['arm_coupon_on_each_subscriptions']) ? $coupon_details['arm_coupon_on_each_subscriptions'] : '0';
                }
                
                if (!empty($stripe_response->plan) && $stripe_response->object == 'subscription') {
    
                    $amount = !empty($stripe_response->plan->amount_decimal) ? $stripe_response->plan->amount_decimal : $stripe_response->plan->amount;
                    $currency = strtoupper($stripe_response->plan->currency);
                    if (!in_array($currency, $zero_demial_currencies)) {
                        $amount = $amount / $arm_stripe_amount_multiply; /* amount comes in as amount in cents, so we need to convert to dollars */
                    }

                    if($extraVars['arm_is_trial'] && isset($extraVars['trial']['amount']))
                    {
                        $amount = $extraVars['trial']['amount'];
                        $arm_is_trial = 1;
                    }

					$arm_payment_date = "";
					if(!empty($stripe_response->current_period_start))
					{
                    	$arm_payment_date = date('Y-m-d H:i:s', $stripe_response->current_period_start);
					}

                    //$arm_token = $stripe_response->customer;
                    $extraVars['arm_stripe_customer_id'] = !empty($stripe_response->customer) ? $stripe_response->customer : '';

                    $arm_token = $stripe_response->id;
                    $arm_transaction_id = $stripe_response->latest_invoice;
                    $arm_payment_type = 'subscription';

                    if( isset($stripe_response->discount) && $stripe_response->discount != null) {
                        if( isset($stripe_response->discount->coupon)) {
                            if($stripe_response->discount->coupon->amount_off != null && $stripe_response->discount->coupon->amount_off != 'null') {

                                $amount_off = $stripe_response->discount->coupon->amount_off;
                              
                                if($amount_off > 0) {

                                    if (!in_array($currency, $zero_demial_currencies)) {
                                        $amount_off = $amount_off/$arm_stripe_amount_multiply;
                                    }

                                    $amount = $amount - $amount_off;
                                }
                            }
                            else if($stripe_response->discount->coupon->percent_off != null && $stripe_response->discount->coupon->percent_off != 'null') {
                                $percent_off = $stripe_response->discount->coupon->percent_off;
                                    
                                if($percent_off > 0) {

                                    $coupon_amount = ($amount*$percent_off)/100;
                                    $coupon_amount = number_format((float)$coupon_amount, $arm_currency_decimal, '.', '');
                                    $amount = $amount - $coupon_amount;
                                }
                            }
                        }
                    }

                    if((empty($stripe_response->discount) || $stripe_response->discount == null || $stripe_response->discount == 'null') && !empty($coupon_code) && !empty($coupon_discount) && !empty($coupon_discount_type))
                    {
                        if($coupon_discount_type == '%'){
                            $amount = $amount - (($amount * $coupon_discount)/100);
                        }else{
                            $amount = $amount - $coupon_discount;
                        }
                    }

                    if($tax_percentage > 0) {
                        if( empty( $tax_display_type ) )
                        {
                            $extraVars['arm_tax_include_exclude_flag'] = 0;
                            $tax_amount = ($amount*$tax_percentage)/100;
                            $tax_amount = number_format((float)$tax_amount, $arm_currency_decimal, '.', '');
                            $amount = $tax_amount + $amount;
                        }
                        else
                        {
                            $extraVars['arm_tax_include_exclude_flag'] = 1;
                            $tax_amount = $arm_membership_setup->arm_calculate_included_tax($amount,$tax_percentage);
                            $tax_amount = number_format((float)$tax_amount, $arm_currency_decimal, '.', '');
                        }
                        $extraVars['tax_amount'] = $tax_amount;
                    }
                } else if(!empty($stripe_response->object) && $stripe_response->object == 'charge' ) {
                    $currency = strtoupper($stripe_response->currency);
                    $amount = $stripe_response->amount;
                    if (!in_array($currency, $zero_demial_currencies)) {
                        $amount = $stripe_response->amount / $arm_stripe_amount_multiply;
                    }
                    /* amount comes in as amount in cents, so we need to convert to dollars */

                    if( !empty($stripe_response->created) ) {
                        $arm_payment_date = date('Y-m-d H:i:s', $stripe_response->created);
                    }
                    else {
                        $arm_payment_date = current_time( 'mysql' );
                    }

                    $arm_token = isset($stripe_response->source->id) ? $stripe_response->source->id : '';
                    $arm_payment_type = 'one_time';
                }

                $payment_log_id = 0;

                if(!empty($stripe_response->object) && ($stripe_response->object == 'charge' || $stripe_response->object == 'subscription')){
                    if($amount < 0) {
                        $amount = 0;
                    }
                    $paid_amount = !empty($stripe_response->amount) ? $stripe_response->amount : 0;
                    $currency = !empty($stripe_response->currency) ? strtoupper($stripe_response->currency) : '';                   
                    if($stripe_response->object == 'subscription')
                    {
                        if(empty($paid_amount) )
                        {
                            $paid_amount = $amount * $arm_stripe_amount_multiply;
                            if(in_array($currency, $zero_demial_currencies))
                            {
                                $paid_amount = $amount;
                            }
                        }
                        $currency = strtoupper($stripe_response->plan->currency);
                    }
                    if (!empty($currency) && !in_array($currency, $zero_demial_currencies)) {
                        $paid_amount = $paid_amount / $arm_stripe_amount_multiply; /* amount comes in as amount in cents, so we need to convert to dollars */
                    }
                    
                    $arm_first_name='';
                    $arm_last_name='';
                    if($user_id){
                        $user_detail = get_userdata($user_id);
                        $arm_first_name=$user_detail->first_name;
                        $arm_last_name=$user_detail->last_name;
                    }

                    global $arm_membership_setup;
                    $arm_payment_status = "success";
                    if(!empty($stripe_response->status))
                    {
                        if($stripe_response->status == "succeeded"){
                            $arm_payment_status = "success";
                        } else {
                            $arm_payment_status = $stripe_response->status;
                        }
                    }
                    $stripe_response = json_encode($stripe_response);
                    $stripe_response = json_decode($stripe_response, TRUE);
                    //$stripe_response = (array)$stripe_response;
                    $stripe_response['arm_payment_mode'] = $payment_mode;
                    $stripe_response['arm_payer_email'] = $entry_email;
                    $stripe_response['arm_payment_gateway_trans_id'] = $arm_transaction_id;
                    $stripe_response['arm_payment_type'] = $arm_payment_type;
                    $stripe_response['payment_type'] = $arm_payment_type;
                    $stripe_response['arm_payment_gateway_token'] = $arm_token;
                    $stripe_response['payment_status'] = $arm_payment_status;
                    $stripe_response['payment_amount'] = $paid_amount;
                    $stripe_response['currency'] = $currency;
                    $stripe_response['arm_coupon_code'] = $coupon_code;
                    $stripe_response['arm_coupon_discount'] = $coupon_discount;
                    $stripe_response['arm_coupon_discount_type'] = $coupon_discount_type;
                    $stripe_response['arm_is_trial'] = isset($extraVars['arm_is_trial']) ? $extraVars['arm_is_trial'] : '0';
                    $stripe_response['arm_coupon_on_each_subscriptions'] = $arm_coupon_on_each_subscriptions;
                    
                    $arm_debug_log_data = array(
                        'stripe_inserted_log_data' => $stripe_response,
                    );
                    do_action('arm_payment_log_entry', 'stripe', 'store save payment log data', 'armember', $arm_debug_log_data, $arm_debug_payment_log_id);

                    $payment_log_id = $arm_membership_setup->arm_store_payment_log($stripe_response, $user_id, $plan_id, $extraVars, 1, 'stripe');
                }

                return $payment_log_id;
            }
            return false;
        }

        function arm_stripe_get_stripe_plan($arm_subscribe_plan_id, $arm_subscribe_plan_cycles = array())
        {
            global $ARMember, $arm_global_settings, $arm_payment_gateways, $arm_debug_payment_log_id, $arm_global_settings;
            $currency = $arm_payment_gateways->arm_get_global_currency();
            
            $general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
            $arm_currency_decimal = isset($general_settings['arm_currency_decimal_digit']) ? $general_settings['arm_currency_decimal_digit'] : 2;
            //$arm_stripe_amount_multiply = str_pad(1, $arm_currency_decimal, 0, STR_PAD_RIGHT);
            $arm_stripe_amount_multiply = 100;

            $arm_debug_log_data = array(
                'arm_subscription_plan_id' => $arm_subscribe_plan_id,
                'arm_subscribe_plan_cycles' => $arm_subscribe_plan_cycles,
            );
            do_action('arm_payment_log_entry', 'stripe', 'get stripe plan args', 'armember', $arm_debug_log_data, $arm_debug_payment_log_id);

            $arm_stripe_api_url = "https://api.stripe.com/v1/";
            $arm_stripe_product_plan_id = '';
            $arm_stripe_product_plan_arr = array();

            if(empty($arm_subscribe_plan_cycles))
            {
                $arm_subscribe_plan_data = new ARM_Plan($arm_subscribe_plan_id);
                $arm_subscribe_plan_cycles = $arm_subscribe_plan_data->options['payment_cycles'];
            }


            $zero_demial_currencies = $arm_payment_gateways->arm_stripe_zero_decimal_currency_array();
            $all_payment_gateways = $arm_payment_gateways->arm_get_active_payment_gateways();
            $stripe_options = !empty($all_payment_gateways['stripe']) ? $all_payment_gateways['stripe'] : array();
            if(!empty($stripe_options) && !is_array($stripe_options))
            {
                return $arm_stripe_product_plan_arr;
            }
            $arm_stripe_secret_key = "";
            if( "live" == $stripe_options['stripe_payment_mode'] )
            {
                $arm_stripe_secret_key = $stripe_options['stripe_secret_key'];
            }
            else 
            {
                $arm_stripe_secret_key = $stripe_options['stripe_test_secret_key'];
            }

            foreach($arm_subscribe_plan_cycles as $arm_subscribe_plan_keys => $arm_subscribe_plan_vals)
            {
                $arm_stripe_product_plan_id = '';

                $arm_subscribe_plan_amount = str_replace(',', '', $arm_subscribe_plan_vals['cycle_amount']);
                $arm_subscribe_plan_interval = $arm_subscribe_plan_vals['billing_type'];
                $arm_subscribe_plan_interval_duration = $arm_subscribe_plan_vals['billing_cycle'];
                $arm_subscribe_plan_currency = $currency;

                if($arm_subscribe_plan_interval == 'D')
                {
                    $arm_subscribe_plan_interval = "day";
                }
                else if($arm_subscribe_plan_interval == 'M')
                {
                    $arm_subscribe_plan_interval = "month";
                }
                else if($arm_subscribe_plan_interval == 'Y')
                {
                    $arm_subscribe_plan_interval = "year";
                }

                $arm_subscribe_plan_details = array(
                    'arm_subs_plan_amount'            => $arm_subscribe_plan_amount,
                    'arm_subs_plan_interval'          => $arm_subscribe_plan_interval,
                    'arm_subs_plan_interval_duration' => $arm_subscribe_plan_interval_duration,
                    'arm_subs_plan_currency'          => $arm_subscribe_plan_currency
                );

                if(!empty($arm_subscribe_plan_details))
                {
                    $arm_subscribe_plan_amount = $arm_subscribe_plan_details['arm_subs_plan_amount'];
                    if (!empty($arm_subscribe_plan_amount)) {
                        if (!in_array(strtoupper($currency), $zero_demial_currencies)) {
                            $arm_subscribe_plan_amount = number_format(str_replace(',', '', $arm_subscribe_plan_amount), $arm_currency_decimal, '.', '');
                            $arm_subscribe_plan_amount = $arm_subscribe_plan_amount * $arm_stripe_amount_multiply;
                        }
                        else{
                            $arm_subscribe_plan_amount = str_replace(",", "", $arm_subscribe_plan_amount);
                            $arm_subscribe_plan_amount = (int)$arm_subscribe_plan_amount;
                        }
                    } else {
                        $amount = "0.00";
                    }
                    $arm_subscribe_plan_interval = $arm_subscribe_plan_details['arm_subs_plan_interval'];
                    $arm_subscribe_plan_interval_duration = $arm_subscribe_plan_details['arm_subs_plan_interval_duration'];
                    $arm_subscribe_plan_currency = $arm_subscribe_plan_details['arm_subs_plan_currency'];

                    $arm_get_stripe_plan_list_url = $arm_stripe_api_url."plans";

                    $arm_stripe_plan_headers = array(
                        'Authorization' => 'Bearer '.$arm_stripe_secret_key
                    );

                    $arm_stripe_plan_data = array('method' => 'GET', 'headers' => $arm_stripe_plan_headers, 'timeout' => '10');

                    $arm_get_stripe_plan_list_response = wp_remote_request($arm_get_stripe_plan_list_url, $arm_stripe_plan_data);

                    if(!is_wp_error($arm_get_stripe_plan_list_response))
                    {
                        $arm_stripe_plan_list_body = wp_remote_retrieve_body($arm_get_stripe_plan_list_response);
                        $arm_stripe_plan_list_data = json_decode($arm_stripe_plan_list_body, true);
                        $arm_stripeget_plan_id ='';
                        if(!empty($arm_stripe_plan_list_data['data']))
                        {
                            foreach($arm_stripe_plan_list_data['data'] as $arm_stripe_plan_key => $arm_stripe_plan_val)
                            {
                                $arm_stripeget_plan_id = '';
                                $arm_stripe_exist_plan_amount = $arm_stripe_plan_val['amount'];
                                $arm_stripe_exist_plan_interval = $arm_stripe_plan_val['interval'];
                                $arm_stripe_exist_plan_interval_duration = $arm_stripe_plan_val['interval_count'];
                                $arm_stripe_exist_plan_currency = $arm_stripe_plan_val['currency'];
                                $arm_stripe_exist_plan_status = $arm_stripe_plan_val['active'];

                                if($arm_stripe_exist_plan_amount == $arm_subscribe_plan_amount && $arm_stripe_exist_plan_interval == $arm_subscribe_plan_interval && $arm_subscribe_plan_interval_duration == $arm_stripe_exist_plan_interval_duration && $arm_subscribe_plan_currency == strtoupper($arm_stripe_exist_plan_currency) && ($arm_stripe_exist_plan_status == true || $arm_stripe_exist_plan_status == 'true'))
                                {
                                    $arm_stripeget_plan_id =$arm_stripe_plan_val['id'];
                                    $arm_stripe_product_plan_id = $arm_stripe_plan_val['product'];
                                    break;
                                }

                            }
                        }

                        //Condition for check that if plan exist or not at stripe side.
                        if(!empty($arm_stripeget_plan_id))
                        {
                            $arm_stripe_product_plan_id = $arm_stripeget_plan_id;
                        }
                        else
                        {
                            //Code For Create Product and Plan
                            $arm_stripe_product_id = "";
                            $arm_stripe_product_name = 'prod_'.uniqid();

                            // Create Plan From Product
                            $arm_stripe_plan_create_url = $arm_stripe_api_url."plans";


                            $arm_stripe_plan_body_data = array(
                                'currency' => $arm_subscribe_plan_currency,
                                'interval' => $arm_subscribe_plan_interval,
                                'interval_count' => $arm_subscribe_plan_interval_duration,
                                'product' => array(
                                    'name' => $arm_stripe_product_name,
                                ),
                            );

                            if (!in_array(strtoupper($currency), $zero_demial_currencies)) {
                                $arm_stripe_plan_body_data['amount_decimal'] = $arm_subscribe_plan_amount;
                            }else{
                                $arm_stripe_plan_body_data['amount'] = (int)(str_replace(',', '', $arm_subscribe_plan_amount));
                            }

                            $arm_stripe_plan_data = array(
                                'method' => 'POST', 
                                'headers' => $arm_stripe_plan_headers, 
                                'body' => $arm_stripe_plan_body_data
                            );

                            $arm_create_stripe_plan_response = wp_remote_request($arm_stripe_plan_create_url, $arm_stripe_plan_data);

                            if(!is_wp_error($arm_create_stripe_plan_response))
                            {
                                $arm_stripe_created_plan_body = wp_remote_retrieve_body($arm_create_stripe_plan_response);
                                $arm_stripe_created_plan_body = json_decode($arm_stripe_created_plan_body, true);
                                $arm_stripe_product_plan_id = !empty($arm_stripe_created_plan_body['product']) ? $arm_stripe_created_plan_body['product'] : '';

                                $arm_stripe_product_plan_id = !empty($arm_stripe_created_plan_body['id']) ? $arm_stripe_created_plan_body['id'] : '';
                            }    
                        }
                    }
                    else
                    {
                        $ARMember->arm_write_response("Reputelog Plan List Response Error => ".maybe_serialize($arm_get_stripe_plan_list_response->get_error_message()));
                    }
                }
                if(!empty($arm_stripe_product_plan_id))
                {
                    array_push($arm_stripe_product_plan_arr, $arm_stripe_product_plan_id);
                }
            }


            do_action('arm_payment_log_entry', 'stripe', 'get stripe plan return data', 'armember', $arm_stripe_product_plan_arr, $arm_debug_payment_log_id);

            return $arm_stripe_product_plan_arr;
        }



        function arm_update_stripe_configuration_setup($update_plan_id, $subscription_plans_data)
        {
            global $wp, $wpdb, $arm_slugs, $ARMember, $arm_global_settings, $arm_access_rules;

                // Code For Update plan setup configuration Data.
                $arm_plan_recurring = new ARM_Plan($update_plan_id);
                if($arm_plan_recurring->is_recurring())
                {
                    //Fetch Plan Cycle Keys
                    $arm_stripe_plan_keys = array();
                    $plan_options = maybe_unserialize($subscription_plans_data['arm_subscription_plan_options']);
                    $arm_plan_keys = $plan_options['payment_cycles'];
                    foreach($arm_plan_keys as $arm_keys => $arm_values)
                    {
                        array_push($arm_stripe_plan_keys, $arm_values['cycle_key']);
                    }

                    //Table name variable
                    $arm_membership_setup_tbl = $ARMember->tbl_arm_membership_setup;

                    //Fetch New Stripe Plan Array from Plan Id
                    $arm_fetch_new_stripe_plan_arr = $this->arm_stripe_get_stripe_plan($update_plan_id);

                    $arm_plan_setup_data = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$arm_membership_setup_tbl} WHERE arm_status = %d", 1)); //phpcs:ignore --Reason $arm_membership_setup_tbl is a table name

                    foreach($arm_plan_setup_data as $arm_setup_data_key => $arm_setup_data_val)
                    {
                        $arm_setup_modules_data = maybe_unserialize($arm_setup_data_val->arm_setup_modules);
                        if((!empty($arm_setup_modules_data['modules']['plans']) && !empty($arm_setup_modules_data['modules']['gateways']) && !empty($arm_setup_modules_data['modules']['payment_mode']['stripe'])) && (in_array($update_plan_id, $arm_setup_modules_data['modules']['plans']) && in_array('stripe', $arm_setup_modules_data['modules']['gateways']) && $arm_setup_modules_data['modules']['payment_mode']['stripe'] != "manual_subscription"))
                        {
                            if(!empty($arm_setup_modules_data['modules']['stripe_plans'][$update_plan_id]))
                            {
                                $arm_new_setup_data = array();
                                if(count($arm_plan_keys)>0)
                                {
                                    for($arm_new_plans = 0;$arm_new_plans < count($arm_plan_keys);$arm_new_plans++)
                                    {
                                        //Modify plan cycle data with stripe plan id.
                                        if(!empty($arm_fetch_new_stripe_plan_arr[$arm_new_plans]))
                                        {
                                            $arm_new_setup_data[$arm_stripe_plan_keys[$arm_new_plans]] = $arm_fetch_new_stripe_plan_arr[$arm_new_plans];
                                        }
                                    }

                                    $arm_setup_modules_data['modules']['stripe_plans'][$update_plan_id] = $arm_new_setup_data;

                                    $arm_setup_new_modules_data = maybe_serialize($arm_setup_modules_data);
                                    $arm_setup_modules_data_update = $wpdb->query($wpdb->prepare("UPDATE {$arm_membership_setup_tbl} SET `arm_setup_modules` = '{$arm_setup_new_modules_data}' WHERE arm_setup_id = %d", $arm_setup_data_val->arm_setup_id)); //phpcs:ignore --Reason $arm_membership_setup_tbl is a table name
                                }
                            }
                        }
                    }
                }
        }


        function arm_retrieve_next_recurring_date_from_subs_id($arm_subscription_id){
            global $ARMember, $arm_payment_gateways;
            $arm_stripe_next_recurring_date = "";
            if(!empty($arm_subscription_id)){
                $all_payment_gateways = $arm_payment_gateways->arm_get_active_payment_gateways();
                $stripe_options = $all_payment_gateways['stripe'];
                $arm_stripe_secret_key = "";
                if ($stripe_options['stripe_payment_mode'] == 'live') {
                    $arm_stripe_secret_key = $stripe_options['stripe_secret_key'];
                } else {
                    $arm_stripe_secret_key = $stripe_options['stripe_test_secret_key'];
                }
                $arm_subscription_url = "https://api.stripe.com/v1/subscriptions/".$arm_subscription_id;

                $arm_subs_data = array(
                    'headers' => array(
                        'Authorization' => 'Bearer '.$arm_stripe_secret_key
                    ),
                );
                $arm_stripe_subs_response = wp_remote_get($arm_subscription_url, $arm_subs_data);
                if(!empty($arm_stripe_subs_response)){
                    $arm_stripe_subs_response = json_decode($arm_stripe_subs_response['body']);
                    $arm_stripe_next_recurring_date = $arm_stripe_subs_response->current_period_end;
                }
            }
            return $arm_stripe_next_recurring_date;
        }
    }
}
global $arm_stripe;
$arm_stripe = new ARM_Stripe();