<?php
/**
 * Give - Stripe Core
 *
 * @since 2.5.0
 *
 * @package    Give
 * @subpackage Stripe Core
 * @copyright  Copyright (c) 2019, GiveWP
 * @license    https://opensource.org/licenses/gpl-license GNU Public License
 */

// Exit, if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'Give_Stripe' ) ) {

	/**
	 * Class Give_Stripe
	 */
	class Give_Stripe {

		/**
		 * Give_Stripe() constructor.
		 *
		 * @since  2.5.0
		 * @access public
		 *
		 * @return void
		 */
		public function __construct() {

			add_filter( 'give_payment_gateways', [ $this, 'register_gateway' ] );

			/**
			 * Using hardcoded constant for backward compatibility of Give 2.5.0 with Recurring 1.8.13 when Stripe Premium is not active.
			 *
			 * This code will handle extreme rare scenario.
			 *
			 * @since 2.5.0
			 *
			 * @todo Remove this constant declaration after 2-3 Give core minor releases.
			 */
			if ( ! defined( 'GIVE_STRIPE_BASENAME' ) ) {
				define( 'GIVE_STRIPE_BASENAME', 'give-stripe/give-stripe.php' );
			}

			$this->includes();
		}

		/**
		 * This function is used to include the related Stripe core files.
		 *
		 * @since 4.0.0 prevented loading translation when using get_plugin_data to avoid _load_textdomain_just_in_time error
		 * @since  2.5.0
		 * @since 2.11.0 Stripe sdk loading logic has been removed because
		 *             Composer autoloader will load it when required.
		 * @access public
		 *
		 * @return void
		 */
		public function includes() {

			// Include files which are necessary to load in admin but not in context of `is_admin`.
			$this->include_admin_files();

			// Load files which are necessary for front as well as admin end.
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/give-stripe-helpers.php';

			// Bailout, if any of the Stripe gateways are not active.
			if ( ! give_stripe_is_any_payment_method_active() ) {

				// Hardcoded recurring plugin basename to show notice even when recurring addon is deactivated.
				$recurring_plugin_basename = 'give-recurring/give-recurring.php';
				$recurring_file_path       = WP_CONTENT_DIR . '/plugins/' . $recurring_plugin_basename;

				// If recurring donations add-on exists.
				if ( file_exists( $recurring_file_path ) ) {

					// If `get_plugin_data` fn not exists then include the file.
					if ( ! function_exists( 'get_plugin_data' ) ) {
						require_once ABSPATH . 'wp-admin/includes/plugin.php';
					}

					$recurring_plugin_data = get_plugin_data( $recurring_file_path, true, false );

					// Avoid fatal error for smooth update for customers.
					if (
						isset( $recurring_plugin_data['Version'] ) &&
						version_compare( '1.9.3', $recurring_plugin_data['Version'], '>=' )
					) {

						// Include frontend files.
						$this->include_frontend_files();

						add_action(
							'admin_notices',
							function() {

								// Register error notice.
								Give()->notices->register_notice(
									[
										'id'          => 'give-recurring-fatal-error',
										'type'        => 'error',
										'description' => sprintf(
											__( '<strong>Action Needed:</strong> Please update the Recurring Donations add-on to version <strong>1.9.4+</strong> in order to be compatible with GiveWP <strong>2.5.5+</strong>. If you are experiencing any issues please rollback GiveWP to 2.5.4 or below using the <a href="%1$s" target="_blank">WP Rollback</a> plugin and <a href="%2$s" target="_blank">contact support</a> for prompt assistance.', 'give' ),
											'https://wordpress.org/plugins/wp-rollback/',
											'https://givewp.com/support/'
										),
										'show'        => true,
									]
								);
							}
						);
					}
				}

				return;
			}

			// Include frontend files.
			$this->include_frontend_files();
		}

		/**
		 * This function is used to include admin files.
		 *
		 * @since  2.6.0
		 * @access public
		 *
		 * @return void
		 */
		public function include_admin_files() {
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/admin/admin-helpers.php';
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/admin/admin-actions.php';
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/admin/admin-filters.php';

			// Deprecations.
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/deprecated/deprecated-functions.php';
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/deprecated/deprecated-filters.php';

			// Load these files when accessed from admin.
			if ( is_admin() ) {
				require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php';
			}
		}

		/**
		 * This function will be used to load frontend files.
		 *
		 * @since  2.6.0
		 * @access public
		 *
		 * @return void
		 */
		public function include_frontend_files() {

			// General.
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/actions.php';
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/filters.php';
			require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/give-stripe-scripts.php';

            // Classes.
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-logger.php';
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-invoice.php';
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-customer.php';
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-payment-intent.php';
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-payment-method.php';
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-checkout-session.php';
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-gateway.php';
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/class-give-stripe-webhooks.php';

            // Payment Methods.
            require_once GIVE_PLUGIN_DIR . 'includes/gateways/stripe/includes/payment-methods/class-give-stripe-card.php';
        }

		/**
		 * Register the payment methods supported by Stripe.
		 *
		 * @access public
		 * @since  2.5.0
		 *
		 * @param array $gateways List of registered gateways.
		 *
		 * @return array
		 */
		public function register_gateway( $gateways ) {

			// Stripe - On page credit card.
			$gateways['stripe'] = [
				'admin_label'    => __( 'Stripe - Credit Card', 'give' ),
				'checkout_label' => __( 'Credit Card', 'give' ),
			];

			// Stripe - Off page credit card (also known as Checkout).
			$gateways['stripe_checkout'] = [
				'admin_label'    => __( 'Stripe - Checkout', 'give' ),
				'checkout_label' => __( 'Credit Card', 'give' ),
			];

			// Stripe - SEPA Direct Debit.
			$gateways['stripe_sepa'] = [
				'admin_label'    => __( 'Stripe - SEPA Direct Debit', 'give' ),
				'checkout_label' => __( 'SEPA Direct Debit', 'give' ),
			];

			// Stripe - BECS Direct Debit.
			$gateways['stripe_becs'] = [
				'admin_label'    => __( 'Stripe - BECS Direct Debit', 'give' ),
				'checkout_label' => __( 'BECS Direct Debit', 'give' ),
			];

			return $gateways;
		}
	}
}

new Give_Stripe();
