<?php
/**
 * Enqueue the scripts that are required by the customizer.
 * Any additional scripts that are required by individual controls
 * are enqueued in the control classes themselves.
 *
 * @package     Kirki
 * @category    Core
 * @author      Aristeides Stathopoulos
 * @copyright   Copyright (c) 2016, Aristeides Stathopoulos
 * @license     http://opensource.org/licenses/https://opensource.org/licenses/MIT
 * @since       1.0
 */

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

if ( ! class_exists('Kirki_Enqueue')) {

    /**
     * Enqueues JS & CSS assets
     */
    class Kirki_Enqueue
    {

        /**
         * The class constructor.
         * Adds actions to enqueue our assets.
         */
        public function __construct()
        {
            add_action('admin_enqueue_scripts', array($this, 'customize_controls_l10n'), 1);
            add_action('customize_controls_enqueue_scripts', array($this, 'customize_controls_enqueue_scripts'), 7);
            add_action('customize_controls_print_scripts', array($this, 'branding'));
            add_action('customize_preview_init', array($this, 'postmessage'));
        }

        /**
         * L10n helper for controls.
         */
        public function customize_controls_l10n()
        {

            // Register the l10n script.
            wp_register_script('kirki-l10n', trailingslashit(Kirki::$url) . 'assets/js/l10n.js');

            // Add localization strings.
            // We'll do this on a per-config basis so that the filters are properly applied.
            $configs = Kirki::$config;
            $l10n    = array();
            foreach ($configs as $id => $args) {
                $l10n[$id] = Kirki_l10n::get_strings($id);
            }

            wp_localize_script('kirki-l10n', 'kirkiL10n', $l10n);
            wp_enqueue_script('kirki-l10n');

        }

        /**
         * Assets that have to be enqueued in 'customize_controls_enqueue_scripts'.
         */
        public function customize_controls_enqueue_scripts()
        {

            // Get an array of all our fields.
            $fields = Kirki::$fields;

            // Do we have tooltips anywhere?
            $has_tooltips = false;
            foreach ($fields as $field) {
                if ($has_tooltips) {
                    continue;
                }
                // Field has tooltip.
                if (isset($field['tooltip']) && ! empty($field['tooltip'])) {
                    $has_tooltips = true;
                }
                // Backwards-compatibility ("help" argument instead of "tooltip").
                if (isset($field['help']) && ! empty($field['help'])) {
                    $has_tooltips = true;
                }
            }

            // If we have tooltips, enqueue the tooltips script.
            /* TODO: if ( $has_tooltips ) { */
            wp_enqueue_script('kirki-tooltip', trailingslashit(Kirki::$url) . 'assets/js/tooltip.js', array('jquery', 'customize-controls', 'jquery-ui-tooltip'));
            /* TODO: } */

            // Enqueue the reset script.
            wp_enqueue_script('kirki-reset', trailingslashit(Kirki::$url) . 'assets/js/reset.js', array('jquery', 'kirki-set-setting-value'));

            // Register kirki-functions.
            wp_register_script('kirki-set-setting-value', trailingslashit(Kirki::$url) . 'assets/js/functions/set-setting-value.js');
            wp_register_script('kirki-validate-css-value', trailingslashit(Kirki::$url) . 'assets/js/functions/validate-css-value.js');
            wp_register_script('kirki-notifications', trailingslashit(Kirki::$url) . 'assets/js/functions/notifications.js', array('kirki-l10n', 'kirki-validate-css-value'));

            // Register serialize.js.
            wp_register_script('serialize-js', trailingslashit(Kirki::$url) . 'assets/js/vendor/serialize.js');

            // Register the color-alpha picker.
            wp_enqueue_style('wp-color-picker');
            wp_register_script('wp-color-picker-alpha', trailingslashit(Kirki::$url) . 'assets/js/vendor/wp-color-picker-alpha.js', array('wp-color-picker'), '1.2', true);

            // Register the jquery-ui-spinner.
            wp_register_script('jquery-ui-spinner', trailingslashit(Kirki::$url) . 'assets/js/vendor/jquery-ui-spinner', array('jquery', 'jquery-ui-core', 'jquery-ui-button'));

            // Register codemirror.
//            wp_register_script('codemirror', trailingslashit(Kirki::$url) . 'assets/js/vendor/codemirror/lib/codemirror.js', array('jquery'));

            // Register selectize.
            wp_register_script('selectize', trailingslashit(Kirki::$url) . 'assets/js/vendor/selectize.js', array('jquery'));

            // An array of control scripts and their dependencies.
            $scripts = array(
                // Add controls scripts.
                'checkbox'        => array('jquery', 'customize-base'),
                'code'            => array('jquery', 'customize-base', 'codemirror'),
                'color'           => array('jquery', 'customize-base', 'wp-color-picker-alpha'),
                'color-palette'   => array('jquery', 'customize-base', 'jquery-ui-button'),
                'dashicons'       => array('jquery', 'customize-base'),
                'date'            => array('jquery', 'customize-base', 'jquery-ui-datepicker'),
                'dimension'       => array('jquery', 'customize-base', 'kirki-notifications'),
                'dropdown-pages'  => array('jquery', 'customize-base', 'selectize'),
                'editor'          => array('jquery', 'customize-base', 'kirki-l10n'),
                'generic'         => array('jquery', 'customize-base'),
                'multicheck'      => array('jquery', 'customize-base'),
                'multicolor'      => array('jquery', 'customize-base', 'wp-color-picker-alpha'),
                'number'          => array('jquery', 'customize-base', 'jquery-ui-spinner'),
                'palette'         => array('jquery', 'customize-base', 'jquery-ui-button'),
                'preset'          => array('jquery', 'customize-base', 'selectize', 'kirki-set-setting-value'),
                'radio-buttonset' => array('jquery', 'customize-base'),
                'radio-image'     => array('jquery', 'customize-base'),
                'radio'           => array('jquery', 'customize-base'),
                'repeater'        => array('jquery', 'customize-base', 'jquery-ui-core', 'jquery-ui-sortable', 'kirki-l10n'),
                'select'          => array('jquery', 'customize-base', 'selectize'),
                'slider'          => array('jquery', 'customize-base'),
                'sortable'        => array('jquery', 'customize-base', 'jquery-ui-core', 'jquery-ui-sortable', 'serialize-js'),
                'spacing'         => array('jquery', 'customize-base', 'kirki-notifications'),
                'switch'          => array('jquery', 'customize-base'),
                'toggle'          => array('jquery', 'customize-base'),
                'typography'      => array('jquery', 'customize-base', 'selectize', 'wp-color-picker-alpha'),
            );
            foreach ($scripts as $id => $dependencies) {
                wp_register_script('kirki-' . $id, trailingslashit(Kirki::$url) . 'assets/js/controls/' . $id . '.js', $dependencies, false, true);
            }

            // Add fonts to our JS objects.
            $google_fonts   = Kirki_Fonts::get_google_fonts();
            $standard_fonts = Kirki_Fonts::get_standard_fonts();
            $all_variants   = Kirki_Fonts::get_all_variants();
            $all_subsets    = Kirki_Fonts::get_google_font_subsets();

            $standard_fonts_final = array();
            foreach ($standard_fonts as $key => $value) {
                $standard_fonts_final[] = array(
                    'family'      => $value['stack'],
                    'label'       => $value['label'],
                    'subsets'     => array(),
                    'is_standard' => true,
                    'variants'    => array(
                        array(
                            'id'    => 'regular',
                            'label' => $all_variants['regular'],
                        ),
                        array(
                            'id'    => 'italic',
                            'label' => $all_variants['italic'],
                        ),
                        array(
                            'id'    => '700',
                            'label' => $all_variants['700'],
                        ),
                        array(
                            'id'    => '700italic',
                            'label' => $all_variants['700italic'],
                        ),
                    ),
                );
            }

            $google_fonts_final = array();
            foreach ($google_fonts as $family => $args) {
                $label    = (isset($args['label'])) ? $args['label'] : $family;
                $variants = (isset($args['variants'])) ? $args['variants'] : array('regular', '700');
                $subsets  = (isset($args['subsets'])) ? $args['subsets'] : array();

                $available_variants = array();
                foreach ($variants as $variant) {
                    if (array_key_exists($variant, $all_variants)) {
                        $available_variants[] = array('id' => $variant, 'label' => $all_variants[$variant]);
                    }
                }

                $available_subsets = array();
                foreach ($subsets as $subset) {
                    if (array_key_exists($subset, $all_subsets)) {
                        $available_subsets[] = array('id' => $subset, 'label' => $all_subsets[$subset]);
                    }
                }

                $google_fonts_final[] = array(
                    'family'   => $family,
                    'label'    => $label,
                    'variants' => $available_variants,
                    'subsets'  => $available_subsets,
                );
            }
            $final = array_merge($standard_fonts_final, $google_fonts_final);
            wp_localize_script('kirki-typography', 'kirkiAllFonts', $final);
            wp_localize_script('kirki-typography', 'kirkiAllVariantsLabels', $all_variants);
        }

        /**
         * Enqueues the script responsible for branding the customizer
         * and also adds variables to it using the wp_localize_script function.
         * The actual branding is handled via JS.
         */
        public function branding()
        {

            $config = apply_filters('kirki/config', array());
            $vars   = array(
                'logoImage'   => '',
                'description' => '',
            );
            if (isset($config['logo_image']) && '' !== $config['logo_image']) {
                $vars['logoImage'] = esc_url_raw($config['logo_image']);
            }
            if (isset($config['description']) && '' !== $config['description']) {
                $vars['description'] = esc_textarea($config['description']);
            }

            if ( ! empty($vars['logoImage']) || ! empty($vars['description'])) {
                wp_register_script('kirki-branding', Kirki::$url . '/assets/js/branding.js');
                wp_localize_script('kirki-branding', 'kirkiBranding', $vars);
                wp_enqueue_script('kirki-branding');
            }
        }

        /**
         * Enqueues the postMessage script
         * and adds variables to it using the wp_localize_script function.
         * The rest is handled via JS.
         */
        public function postmessage()
        {
            wp_enqueue_script('kirki_auto_postmessage', trailingslashit(Kirki::$url) . 'assets/js/postmessage.js', array('customize-preview'), false, true);
            $js_vars_fields = array();
            $fields         = Kirki::$fields;
            foreach ($fields as $field) {
                if (isset($field['transport']) && 'postMessage' === $field['transport'] && isset($field['js_vars']) && ! empty($field['js_vars']) && is_array($field['js_vars']) && isset($field['settings'])) {
                    $js_vars_fields[$field['settings']] = $field['js_vars'];
                }
            }
            wp_localize_script('kirki_auto_postmessage', 'jsvars', $js_vars_fields);
        }
    }
}
