<?php
/**
 * AjaxPress Boot Loader Class.
 *
 * @package AjaxPress
 * @since 1.3.0
 */
// Namespace.
namespace AjaxPress;

// Exit if access directly.
defined( 'ABSPATH' ) || die( 'Uhu, we don\'t do this here' );

if ( ! class_exists( __NAMESPACE__ . '\Boot') ) {

	/**
	 * AjaxPress Boot Loader Class.
	 */
	class Boot {

		/**
		 * Start the plugin
		 *
		 * @return void
		 */
		public static function start(): void {
			$self = new self();
			$self->constants();
			$self->includes();
		}

		/**
		 * Define plugin constants.
		 *
		 * @return void
		 */
		private function constants(): void {
			define('AJAXPRESS_URL', plugin_dir_url( AJAXPRESS ));
			define('AJAXPRESS_PATH', plugin_dir_path( AJAXPRESS ));
			define('AJAXPRESS_INCLUDES', AJAXPRESS_PATH . '/includes/');
			define('AJAXPRESS_PREFIX', 'ajaxpress_');
		}

		/**
		 * Include plugin files.
		 *
		 * @return void
		 */
		private function includes(): void {
			$this->include_common_files();
			$this->include_admin_files();
		}

		/**
		 * Include common files.
		 *
		 * @return void.
		 */
		private function include_common_files(): void {
			// For everyone.
			require_once AJAXPRESS_INCLUDES . 'common/abstract-class-base.php';
			require_once AJAXPRESS_INCLUDES . 'common/class-options.php';
			require_once AJAXPRESS_INCLUDES . 'common/class-license.php';

			// For only frontend.
			if ( ! is_admin() ) {
				require_once AJAXPRESS_INCLUDES . 'classes/class-enqueues.php';
				require_once AJAXPRESS_INCLUDES . 'classes/class-templates.php';
			}
		}

		/**
		 * Include admin files.
		 *
		 * @return void.
		 */
		private function include_admin_files(): void {
			if ( is_admin() ) {
				require_once plugin_dir_path( AJAXPRESS ) . 'languages/class-language.php';
				require_once AJAXPRESS_INCLUDES . 'admin/class-admin-enqueues.php';
				require_once AJAXPRESS_INCLUDES . 'admin/class-admin-hooks.php';
			require_once AJAXPRESS_INCLUDES . 'admin/class-deactivate-feedback.php';
			}

			require_once AJAXPRESS_INCLUDES . 'admin/class-admin-rest.php';
		}
	}

	// Let's start dude.
	Boot::start();
}
