<?php

/**
* This class takes care of all form related functionality
 *
 * @access private
 * @ignore
*/
class MC4WP_Form_Asset_Manager
{

    /**
     * @var bool
     */
    protected $load_scripts = false;

    /**
     * @var string
     */
    protected $filename_suffix = '';

    /**
     * MC4WP_Form_Asset_Manager constructor.
     */
    public function __construct()
    {
        $this->filename_suffix =(defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min';
    }

    /**
     * Add hooks
     */
    public function hook()
    {
        // load checkbox css if necessary
        add_action('wp_enqueue_scripts', array( $this, 'load_stylesheets' ));
        add_action('mc4wp_output_form', array( $this, 'before_output_form' ));
        add_action('wp_footer', array( $this, 'load_scripts' ));

        $this->register_assets();
    }

    /**
     * Register the various JS files used by the plugin
     */
    public function register_assets()
    {
        $suffix = $this->filename_suffix;

        wp_register_script('mc4wp-forms-api', MC4WP_PLUGIN_URL . 'assets/js/forms-api'.  $this->filename_suffix .'.js', array(), MC4WP_VERSION, true);

        /**
         * Runs right after all assets (scripts & stylesheets) for forms have been registered
         *
         * @since 3.0
         * @deprecated 3.1.9
         *
         * @param string $suffix The suffix to add to the filename, before the file extension. Is usually set to ".min".
         * @ignore
         */
        do_action('mc4wp_register_form_assets', $suffix);
    }


    /**
     * @param string $stylesheet
     *
     * @return bool
     */
    public function is_registered_stylesheet($stylesheet)
    {
        $stylesheets = $this->get_registered_stylesheets();
        return in_array($stylesheet, $stylesheets);
    }

    /**
     * @return array
     */
    public function get_registered_stylesheets()
    {
        return array(
            'basic',
            'themes'
        );
    }

    /**
     * @param string $stylesheet
     *
     * @return string
     */
    public function get_stylesheet_url($stylesheet)
    {
        if (! $this->is_registered_stylesheet($stylesheet)) {
            return '';
        }

        $suffix = $this->filename_suffix;
        return MC4WP_PLUGIN_URL . 'assets/css/form-' . $stylesheet . $suffix . '.css';
    }

    /**
     * Get array of stylesheet handles which should be enqueued.
     *
     * @return array
     */
    public function get_active_stylesheets()
    {
        $stylesheets = (array) get_option('mc4wp_form_stylesheets', array());

        /**
         * Filters the stylesheets to be loaded
         *
         * Should be an array of stylesheet handles previously registered using `wp_register_style`.
         * Each value is prefixed with `mc4wp-form-` to get the handle.
         *
         * Return an empty array if you want to disable the loading of all stylesheets.
         *
         * @since 3.0
         * @param array $stylesheets Array of valid stylesheet handles
         */
        $stylesheets = (array) apply_filters('mc4wp_form_stylesheets', $stylesheets);
        return $stylesheets;
    }

    /**
     * Load the various stylesheets
     */
    public function load_stylesheets()
    {
        $stylesheets = $this->get_active_stylesheets();

        foreach ($stylesheets as $stylesheet) {
            if (! $this->is_registered_stylesheet($stylesheet)) {
                continue;
            }

            $handle = 'mc4wp-form-' . $stylesheet;
            wp_enqueue_style($handle, $this->get_stylesheet_url($stylesheet), array(), MC4WP_VERSION);
            add_editor_style($this->get_stylesheet_url($stylesheet));
        }

        /**
         * @ignore
         */
        do_action('mc4wp_load_form_stylesheets', $stylesheets);

        return true;
    }

    /**
     * Get configuration object for client-side use.
     *
     * @return array
     */
    public function get_javascript_config()
    {
        $submitted_form = mc4wp_get_submitted_form();
        if (! $submitted_form instanceof MC4WP_Form) {
            return array();
        }

        $config = array(
            'submitted_form' => array(
                'id' => $submitted_form->ID,
                'event' => $submitted_form->last_event,
                'data' => $submitted_form->get_data(),
                'element_id' => $submitted_form->config['element_id'],
            )
        );

        if ($submitted_form->has_errors()) {
            $config['submitted_form']['errors'] = $submitted_form->errors;
        }

        $auto_scroll = true;

        /**
         * Filters the `auto_scroll` setting for when a form is submitted.
         * Set to false to disable scrolling to form.
         *
         * @param boolean $auto_scroll
         * @since 3.0
         */
        $config['auto_scroll'] = apply_filters('mc4wp_form_auto_scroll', $auto_scroll);

        return $config;
    }

    /**
     * Load JavaScript files
     */
    public function before_output_form()
    {
        // print dummy JS
        $this->print_dummy_javascript();

        // set flags
        $this->load_scripts = true;
    }

    /**
     * Prints dummy JavaScript which allows people to call `mc4wp.forms.on()` before the JS is loaded.
     */
    public function print_dummy_javascript()
    {
        $file = dirname(__FILE__) . '/views/js/dummy-api.js';
        echo '<script>';
        include $file;
        echo '</script>';
    }

    /**
    * Outputs the inline JavaScript that is used to enhance forms
    */
    public function load_scripts()
    {
        $load_scripts = $this->load_scripts;

        /** @ignore */
        $load_scripts = apply_filters('mc4wp_load_form_scripts', $load_scripts);
        if (! $load_scripts) {
            return;
        }

        global $wp_scripts;

        // make sure scripts are loaded
        wp_enqueue_script('mc4wp-forms-api');
        wp_localize_script('mc4wp-forms-api', 'mc4wp_forms_config', $this->get_javascript_config());

        // load placeholder polyfill if browser is Internet Explorer
        wp_enqueue_script('mc4wp-forms-placeholders', MC4WP_PLUGIN_URL . 'assets/js/third-party/placeholders.min.js', array(), MC4WP_VERSION, true);
        $wp_scripts->add_data('mc4wp-forms-placeholders', 'conditional', 'lte IE 9');

        // print inline scripts depending on printed fields
        echo '<script>';
        echo '(function() {';
        include dirname(__FILE__) . '/views/js/general-form-enhancements.js';
        include dirname(__FILE__) . '/views/js/url-fields.js';
        include dirname(__FILE__) . '/views/js/date-fields.js';
        echo '})();';
        echo '</script>';

        /** @ignore */
        do_action('mc4wp_load_form_scripts');
    }
}
