<?php // phpcs:ignore WordPress.Files.FileName

/**
 * Initialize the Redux Template Library.
 *
 * @since 4.0.0
 * @package Redux Framework
 */

namespace ReduxTemplates;

use Redux_Connection_Banner;
use Redux_Core;
use Redux_Filesystem;
use Redux_Functions;
use Redux_Functions_Ex;
use Redux_Helpers;
use ReduxTemplates;
use function base64_encode; // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode

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

/**
 * Redux Templates Init Class
 *
 * @since 4.0.0
 */
class Init {

	/**
	 * Default left value
	 *
	 * @var int
	 */
	public static $default_left = 5;

	/**
	 * Init constructor.
	 *
	 * @access public
	 */
	public function __construct() {
		global $pagenow;

		if ( 'widgets.php' === $pagenow ) {
			return;
		}

		add_action( 'init', array( $this, 'load' ) );

		if ( did_action( 'init' ) ) { // In case the devs load it at the wrong place.
			$this->load();
		}

		if ( false === Redux_Core::$redux_templates_enabled ) {
			return;
		}

		// Editor Load.
		add_action( 'enqueue_block_editor_assets', array( $this, 'editor_assets' ), 1 );
		// Admin Load.
		add_action( 'admin_enqueue_scripts', array( $this, 'admin_assets' ) );
		// Initiate the custom css fields.
		Gutenberg_Custom_CSS::instance();

	}

	/**
	 * Load everything up after init.
	 *
	 * @access public
	 * @since 4.0.0
	 */
	public static function load() {
		new ReduxTemplates\API();
		new ReduxTemplates\Templates();
		new ReduxTemplates\Notice_Overrides();
	}

	/**
	 * Get local contents of a file.
	 *
	 * @param string $file_path File path.
	 *
	 * @access public
	 * @return string
	 * @since 4.0.0
	 */
	public static function get_local_file_contents( string $file_path ): string {
		$fs = Redux_Filesystem::get_instance();
		return $fs->get_contents( $file_path );
	}

	/**
	 * Load Editor Styles and Scripts.
	 *
	 * @access public
	 * @since 4.0.0
	 */
	public function editor_assets() {
		$fs  = Redux_Filesystem::get_instance();
		$min = Redux_Functions::is_min();

		// Little safety here for developers.
		if ( ! $fs->file_exists( REDUXTEMPLATES_DIR_PATH . "assets/js/redux-templates$min.js" ) ) {
			if ( '.min' === $min ) {
				$min = '';
			} else {
				$min = '.min';
			}
		}
		$version = REDUXTEMPLATES_VERSION;
		// When doing local dev work. Otherwise, follow the check for dev_mode or not.
		if ( defined( 'REDUX_PLUGIN_FILE' ) ) {
			if ( $fs->file_exists( trailingslashit( dirname( REDUX_PLUGIN_FILE ) ) . 'local_developer.txt' ) ) {
				$min = '';
			}
			$version = time();
		}
		$min = ''; // Fix since our min'd file isn't working.

		wp_enqueue_script(
			'redux-templates-js',
			plugins_url( "assets/js/redux-templates$min.js", REDUXTEMPLATES_FILE ),
			array( 'code-editor', 'csslint', 'wp-i18n', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks' ),
			$version,
			true
		);

		wp_set_script_translations( 'redux-templates-js', 'redux-templates' );

		// Backend editor scripts: common vendor files.
		wp_enqueue_script(
			'redux-templates-js-vendor',
			plugins_url( "assets/js/vendor$min.js", REDUXTEMPLATES_FILE ),
			array(),
			$version,
			true
		);

		// We started using the CSS variables. This gives us the function before it's put in core.
		if ( version_compare( get_bloginfo( 'version' ), '5.5', '<' ) ) {
			if ( ! defined( 'GUTENBERG_VERSION' ) || ( defined( 'GUTENBERG_VERSION' ) && version_compare( GUTENBERG_VERSION, '8.5.1', '<' ) ) ) {
				wp_register_style( 'redux-templates-gutenberg-compatibility', false, array(), $version );
				wp_enqueue_style( 'redux-templates-gutenberg-compatibility' );
				wp_add_inline_style( 'redux-templates-gutenberg-compatibility', ':root {--wp-admin-theme-color: #007cba;}' );
			}
		}

		$global_vars = array(
			'i18n'              => 'redux-framework',
			'plugin'            => REDUXTEMPLATES_DIR_URL,
			'mokama'            => Redux_Helpers::mokama(),
			'key'               => base64_encode( Redux_Functions::gs() ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
			'version'           => Redux_Core::$version,
			'supported_plugins' => array(), // Load the supported plugins.
			'tos'               => Redux_Connection_Banner::tos_blurb( 'import_wizard' ),
		);
		if ( ! $global_vars['mokama'] ) {
			// phpcs:disable Squiz.PHP.CommentedOutCode
			// delete_user_meta( get_current_user_id(), '_redux_templates_counts'); // To test left.
			$global_vars['left'] = self::left( get_current_user_id() );

			// phpcs:ignore
			// delete_user_meta( get_current_user_id(), '_redux_welcome_guide' ); // For testing.
			if ( Redux_Helpers::is_gutenberg_page() && $global_vars['left'] === self::$default_left ) {
				// We don't want to show unless Gutenberg is running, and they haven't tried the library yet.
				$launched = get_user_meta( get_current_user_id(), '_redux_welcome_guide', true );
				if ( '1' !== $launched ) {
					$global_vars['welcome'] = 1;
				}
			}
		}

		if ( ! $global_vars['mokama'] ) {
			$global_vars['u'] = rtrim( Redux_Functions_Ex::get_site_utm_url( '', 'library', true ), '1' );
		}

		wp_localize_script(
			'redux-templates-js',
			'redux_templates',
			$global_vars
		);

		wp_enqueue_style(
			'redux-fontawesome',
			REDUXTEMPLATES_DIR_URL . 'assets/css/font-awesome.min.css',
			false,
			$version
		);
		$extra_css = ReduxTemplates\Templates::inline_editor_css();
		if ( ! empty( $extra_css ) ) {
			wp_add_inline_style( 'redux-fontawesome', $extra_css );
		}
	}

	/**
	 * Admin Style & Script.
	 *
	 * @access public
	 * @since 4.0.0
	 */
	public function admin_assets() {
		wp_enqueue_style(
			'redux-templates-bundle',
			REDUXTEMPLATES_DIR_URL . 'assets/css/admin.min.css',
			false,
			REDUXTEMPLATES_VERSION
		);
	}

	/**
	 * Get the items left.
	 *
	 * @param int $uid User ID number.
	 * @access public
	 * @since 4.1.18
	 * @return int
	 */
	public static function left( int $uid ): int {
		$count = get_user_meta( $uid, '_redux_templates_counts', true );
		if ( empty( $count ) ) {
			$count = self::$default_left;
		}
		if ( $count <= 0 ) {
			$count = 0;
		}

		return $count;
	}

}

new Init();
