<?php
/**
 * Plugin Name: Easy Digital Downloads - Commissions
 * Plugin URI: https://easydigitaldownloads.com/downloads/commissions/
 * Description: Record commissions automatically for users in your site when downloads are sold.
 * Author: Easy Digital Downloads
 * Author URI: https://easydigitaldownloads.com
 * Version: 3.6.3
 * Requires at least: 5.8
 * Requires PHP: 7.4
 * Text Domain: eddc
 * Domain Path: languages
 */

// Exit if accessed directly.
defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore

if ( ! class_exists( 'EDDC' ) ) {

	// Plugin version
	define( 'EDD_COMMISSIONS_VERSION', '3.6.3' );

	// Plugin folder url
	define( 'EDDC_PLUGIN_URL', plugin_dir_url( __FILE__ ) );

	// Plugin folder path
	define( 'EDDC_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );

	// Plugin root file
	define( 'EDDC_PLUGIN_FILE', __FILE__ );

	/**
	 * Main EDDC class
	 *
	 * @since       3.4.0
	 */
	class EDDC {

		/**
		 * @var         EDDC $instance The one true EDDC
		 * @since       3.4.0
		 */
		private static $instance;


		/**
		 * The database helper class.
		 *
		 * @var EDD\Commissions\Database\Legacy $commissions_db
		 * @since 3.4.0
		 * @since 3.6.0 Updated to EDD\Commissions\Database\Legacy
		 */
		public $commissions_db;

		/**
		 * The database helper class for meta.
		 *
		 * @var         EDD\Commissions\Database\Meta $commission_meta_db
		 * @since       3.4.0
		 */
		public $commission_meta_db;


		private function __construct() {

			$this->licensing();
			$this->includes();
			$this->load_textdomain();
			$this->hooks();
			$this->commissions_db     = new EDD\Commissions\Database\Legacy();
			$this->commission_meta_db = new EDD\Commissions\Database\Meta();
		}
		/**
		 * Get active instance
		 *
		 * @access      public
		 * @since       3.4.0
		 * @return      object self::$instance The one true EDDC
		 */
		public static function instance() {
			if ( ! self::$instance ) {
				self::$instance = new EDDC();
			}

			return self::$instance;
		}

		/**
		 * Configures licensing and automatic updates.
		 *
		 * @since 3.4.13
		 */
		private function licensing() {
			add_action(
				'edd_extension_license_init',
				function ( \EDD\Extensions\ExtensionRegistry $registry ) {
					$registry->addExtension( __FILE__, 'Commissions', 2990, EDD_COMMISSIONS_VERSION );
				}
			);
		}

		/**
		 * Include necessary files
		 *
		 * @access      private
		 * @since       1.0.1
		 * @return      void
		 */
		private function includes() {
			// Integration - Simple Shipping
			if ( class_exists( 'EDD_Simple_Shipping' ) ) {
				require_once EDDC_PLUGIN_DIR . 'includes/integrations/simple-shipping.php';
			}

			// Integration - Paypal Adaptive
			if ( function_exists( 'epap_load_class' ) ) {
				require_once EDDC_PLUGIN_DIR . 'includes/deprecated/paypal-adaptive-payments.php';
			}

			// Integration - Recurring Payments
			if ( class_exists( 'EDD_Recurring' ) ) {
				require_once EDDC_PLUGIN_DIR . 'includes/integrations/recurring-payments.php';
			}

			require_once EDDC_PLUGIN_DIR . 'includes/commission-actions.php';
			require_once EDDC_PLUGIN_DIR . 'includes/commission-functions.php';
			require_once EDDC_PLUGIN_DIR . 'includes/deprecated/commission-filters.php';
			require_once EDDC_PLUGIN_DIR . 'includes/email-functions.php';
			require_once EDDC_PLUGIN_DIR . 'includes/deprecated/classes.php';
			require_once EDDC_PLUGIN_DIR . 'includes/install.php';
			require_once EDDC_PLUGIN_DIR . 'includes/scripts.php';
			require_once EDDC_PLUGIN_DIR . 'includes/short-codes.php';
			require_once EDDC_PLUGIN_DIR . 'includes/user-meta.php';
			require_once EDDC_PLUGIN_DIR . 'includes/classes/class-rest-api.php';

			require_once EDDC_PLUGIN_DIR . 'includes/classes/reports/class-monthly-breakdown.php';

			if ( defined( 'WP_CLI' ) && WP_CLI ) {
				require_once EDDC_PLUGIN_DIR . '/includes/integrations/wp-cli.php';
			}

			if ( is_admin() ) {
				require_once EDDC_PLUGIN_DIR . 'includes/admin/commissions.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/commissions-actions.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/commissions-filters.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/customers.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/export-actions.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/export-functions.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/metabox.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/misc-functions.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/reports/class-commissions-reports.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/reports/class-commissions-reports-chart.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/reports/reports-export.php';

				require_once EDDC_PLUGIN_DIR . 'includes/admin/settings.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/widgets.php';

				require_once EDDC_PLUGIN_DIR . 'includes/admin/classes/EDD_C_List_Table.php';
				require_once EDDC_PLUGIN_DIR . 'includes/admin/classes/class-admin-notices.php';

				require_once EDDC_PLUGIN_DIR . 'includes/admin/upgrades.php';
				require_once EDDC_PLUGIN_DIR . 'includes/deprecated-functions.php';

				$order_details = new EDD\Commissions\Admin\Order\Details();
				$manager       = new EDD\EventManagement\EventManager();
				$manager->add_subscriber( $order_details );
			}

			if ( eddc_are_email_templates_registered() ) {
				new EDD\Commissions\Emails\Registry();
			}
		}


		/**
		 * Run action and filter hooks
		 *
		 * @access      private
		 * @since       1.0.1
		 * @return      void
		 */
		private function hooks() {
			// Runs the installation if it hasn't run already.
			add_action(
				'admin_init',
				function () {
					if ( get_option( 'eddc_run_install' ) ) {
						edd_commissions_install();

						delete_option( 'eddc_run_install' );
					}
				}
			);

			add_action( 'edd_setup_components', array( $this, 'setup_commissions_components' ) );
			add_action( 'init', array( $this, 'check_for_updates' ) );
			add_filter( 'edd_telemetry_products', array( \EDD\Commissions\Telemetry\Products::class, 'add_commissions_data' ) );
		}


		/**
		 * Run action and filter hooks
		 *
		 * @deprecated 3.5.2 In favour of anonymous function outside this class.
		 *
		 * @access      public
		 * @since       3.4.0
		 * @return      void
		 */
		public function add_fes_functionality() {
			_deprecated_function( __FUNCTION__, '3.5.2' );
		}


		/**
		 * Internationalization
		 *
		 * @access      public
		 * @since       1.0.1
		 * @return      void
		 */
		public function load_textdomain() {
			// Set filter for language directory
			$lang_dir = EDDC_PLUGIN_DIR . '/languages/';
			$lang_dir = apply_filters( 'eddc_languages_directory', $lang_dir );

			// Traditional WordPress plugin locale filter
			$locale = apply_filters( 'plugin_locale', get_locale(), 'eddc' );
			$mofile = sprintf( '%1$s-%2$s.mo', 'eddc', $locale );

			// Setup paths to current locale file
			$mofile_local  = $lang_dir . $mofile;
			$mofile_global = WP_LANG_DIR . '/edd-commissions/' . $mofile;

			if ( file_exists( $mofile_global ) ) {
				// Look in global /wp-content/languages/edd-commissions/ folder
				load_textdomain( 'eddc', $mofile_global );
			} elseif ( file_exists( $mofile_local ) ) {
				// Look in local /wp-content/plugins/eddc/languages/ folder
				load_textdomain( 'eddc', $mofile_local );
			} else {
				// Load the default language files
				load_plugin_textdomain( 'eddc', false, $lang_dir );
			}
		}

		/**
		 * Setup the commissions components with Berlin.
		 *
		 * @since 3.6.0
		 */
		public function setup_commissions_components() {
			edd_register_component(
				'commission',
				array(
					'schema' => '\\EDD\\Commissions\\Database\\Schemas\\Commissions',
					'table'  => '\\EDD\\Commissions\\Database\\Tables\\Commissions',
					'meta'   => '\\EDD\\Commissions\\Database\\Tables\\CommissionMeta',
					'query'  => '\\EDD\\Commissions\\Database\\Queries\\Commission',
					'object' => '\\EDD\\Commissions\\Commission',
				)
			);
		}

		/**
		 * Check for updates that will run in the background.
		 *
		 * @since 3.6.0
		 */
		public function check_for_updates() {
			$upgrades = array(
				'eddc_exchange_rates' => EDD\Commissions\Upgrades\ExchangeRates::class,
			);

			foreach ( $upgrades as $upgrade => $class_name ) {
				if ( ! edd_has_upgrade_completed( $upgrade ) ) {
					$upgrader = new $class_name();
				}
			}
		}
	}
}

/**
 * The main function responsible for returning the one true EDDC
 * instance to functions everywhere
 *
 * @since       1.0.0
 * @return      \EDDC The one true EDDC
 */
function edd_commissions() {
	return EDDC::instance();
}

require_once __DIR__ . '/vendor/autoload.php';
\EDD\ExtensionUtils\v1\ExtensionLoader::loadOrQuit(
	__FILE__,
	'edd_commissions',
	array(
		'php'                    => '7.4',
		'easy-digital-downloads' => '3.2.12',
		'wp'                     => '5.8',
	)
);

register_activation_hook(
	__FILE__,
	function () {
		update_option( 'eddc_run_install', time() );
	}
);

/**
 * FES integration has to be hooked in before the normal boot sequence (which uses `plugins_loaded`)
 * in order to load in time.
 * @link https://github.com/awesomemotive/EDD-Commissions/issues/474
 */
add_filter(
	'fes_load_fields_array',
	function ( $fields ) {
		if ( ! defined( 'fes_plugin_version' ) || version_compare( fes_plugin_version, '2.3', '<' ) ) {
			return $fields;
		}

		require_once EDDC_PLUGIN_DIR . 'includes/integrations/fes-commissions-email-field.php';

		$fields['eddc_user_paypal'] = 'FES_Commissions_Email_Field';

		return $fields;
	}
);
