<?php
/**
 * @author : Jegtheme
 */
namespace JNews;

/**
 * Class JNews Shortcode
 */
Class Shortcode
{
    /**
     * @var Shortcode
     */
    private static $instance;

    /**
     * @return Shortcode
     */
    public static function getInstance()
    {
        if (null === static::$instance) {
            static::$instance = new static();
        }
        return static::$instance;
    }

    private function __construct()
    {
        if (apply_filters('jnews_load_shortcode_detail', false))
        {
            if( is_admin() ) {
                $this->setup_hook();
            }
            $this->render_element();
        }
    }

    protected function get_theme_version() {
        $theme = wp_get_theme();

        return $theme->get( 'Version' );
    }

    public function setup_hook() {
        add_action('admin_enqueue_scripts', array($this, 'load_script'));
        add_action('current_screen'	, array($this, 'shortcode_button'));
    }

    public function load_script()
    {
        wp_enqueue_style('wp-color-picker');
        wp_enqueue_script('wp-color-picker');
        wp_enqueue_script('jquery-ui-dialog');
    }

    public function render_element()
    {
        do_action('jnews_render_element', 'spacing', array($this, 'spacing'));
    }

    public function spacing($atts, $content = null)
    {
        $atts = shortcode_atts(
            array(
                'class' => '',
                'size' => '10',
            ),
            $atts
        );

        return "<div class='clearfix {$atts['class']}' style='padding-bottom: {$atts['size']}px'></div>";
    }

    public function shortcode_button()
    {
        $screen = get_current_screen();
        if( ( $screen->post_type === 'post' || $screen->post_type === 'page' ) && $screen->post_type !== '')
        {
            if ( ( current_user_can('edit_posts') || current_user_can('edit_pages') ) &&  get_user_option('rich_editing') == 'true')
            {
                add_filter( 'mce_external_plugins'	, array($this, 'add_tinymce_plugin'));
                add_filter( 'mce_buttons_3'			, array($this, 'register_button'));
                add_action( 'admin_enqueue_scripts' , array( $this, 'enqueue_script' ) );
                add_action( 'admin_footer'          , array( $this, 'template_script' ) );
            }
        }
    }

    public function add_tinymce_plugin($plugin_array)
    {
        $plugin_array['jnews_shortcode'] = JNEWS_THEME_URL . '/assets/js/admin/jnews-shortcode.js';
        return $plugin_array;
    }

    public function register_button($buttons)
    {
        array_push( $buttons, 'jnews_grid');
        array_push( $buttons, '|');
        array_push( $buttons, 'jnews_intro');
        array_push( $buttons, 'jnews_dropcaps');
        array_push( $buttons, 'jnews_highlight');
        array_push( $buttons, 'jnews_pullquote');
        array_push( $buttons, '|');
        array_push( $buttons, 'jnews_alert');
        array_push( $buttons, 'jnews_btn');
        array_push( $buttons, 'jnews_spacing');
        array_push( $buttons, 'jnews-shortcode-generator');
        return $buttons;
    }

    /**
     * Get registered element
     *
     * @return array
     */
    public function get_registered_element() {
        return apply_filters( 'jnews_shortcode_elements', array() );
    }

    /**
     * Enqueue script
     */
    public function enqueue_script() {
        wp_enqueue_style( 'jnews-shortcode-style', get_parent_theme_file_uri('/assets/css/admin/shortcode-builder.css'), null, jeg_get_version() );

        wp_enqueue_script( 'jnews-shortcode-generator', get_parent_theme_file_uri('/assets/js/admin/shortcode-generator.js'), array(
            'underscore',
            'wp-util',
            'customize-base',
            'jquery-ui-draggable',
            'jnews-essential-local',
        ), $this->get_theme_version(), true );

        wp_localize_script( 'jnews-shortcode-generator', 'jnewsshortcode', array(
            'nonce'    => wp_create_nonce( 'jnews' ),
            'elements' => $this->get_registered_element(),
            'title'    => esc_html__( 'JNews Shortcode Generator', 'jnews' ),
            'close'    => esc_html__( 'Close', 'jnews' ),
            'generate' => esc_html__( 'Generate', 'jnews' ),
        ) );
    }

    public function get_default_group() {
        return esc_html__( 'General', 'jnews' );
    }

    /**
     * Convert Type
     *
     * @param $type
     *
     * @return string
     */
    public function convert_type( $type ) {
        if ( $type === 'textfield' ) {
            return 'text';
        }

        if ( $type === 'colorpicker' ) {
            return 'color';
        }

        if ( $type === 'dropdown' ) {
            return 'select';
        }

        if ( $type === 'textarea_html' ) {
            return 'textarea';
        }

        if ( $type === 'attach_image' ) {
            return 'image';
        }

        return $type;
    }

    public function prepare_segments( $options ) {
        $segments = array();
        $priority = 1;

        foreach ( $options as $option ) {
            if ( ! isset( $option['group'] ) || empty( $option['group'] ) ) {
                $option['group'] = $this->get_default_group();
            }

            $id = sanitize_title_with_dashes( $option['group'] );

            if ( ! isset( $segments[ $id ] ) ) {
                $segments[ $id ] = array(
                    'id'       => $id,
                    'type'     => 'widget',
                    'name'     => $option['group'],
                    'priority' => $priority ++,
                );
            }
        }

        return $segments;
    }


    /**
     * Prepare option to be loaded on Widget
     *
     * @param array $instance
     * @param array $fields
     *
     * @return mixed
     */
    public function prepare_fields( $instance, $fields ) {
        $setting = array();

        foreach ( $fields as $key => $field ) {
            if ( $field['param_name'] === 'compatible_column_notice' ) {
                continue;
            }

            $setting[ $key ]              = array();
            $setting[ $key ]['id']        = $field['param_name'];
            $setting[ $key ]['fieldID']   = $field['param_name'];
            $setting[ $key ]['fieldName'] = $field['param_name'];
            $setting[ $key ]['type']      = $this->convert_type( $field['type'] );

            $setting[ $key ]['title']       = isset( $field['heading'] ) ? $field['heading'] : '';
            $setting[ $key ]['description'] = isset( $field['description'] ) ? $field['description'] : '';
            $setting[ $key ]['segment']     = isset( $field['group'] ) ? sanitize_title_with_dashes( $field['group'] ) : sanitize_title_with_dashes( $this->get_default_group() );
            $setting[ $key ]['default']     = isset( $field['std'] ) ? $field['std'] : '';
            $setting[ $key ]['priority']    = isset( $field['priority'] ) ? $field['priority'] : 10;
            $setting[ $key ]['options']     = isset( $field['value'] ) ? array_flip( $field['value'] ) : array();

            if ( $field['type'] === 'slider' || $field['type'] === 'number' ) {
                $setting[ $key ]['options'] = array(
                    'min'  => $field['min'],
                    'max'  => $field['max'],
                    'step' => $field['step'],
                );
            }

            if ( 'select' === $field['type'] ) {
                if ( isset( $field['value'] ) ) {
                    $setting[ $key ]['options'] = array_flip( $field['value'] );
                }
                if ( isset( $field['options'] ) ) {
                    $value                      = isset( $instance[ $field['param_name'] ] ) ? $instance[ $field['param_name'] ] : null;
                    $setting[ $key ]['options'] = call_user_func_array( $field['options'], array( $value ) );
                }
            }

            if ( isset( $field['dependency'] ) ) {
                if ( is_array( $field['dependency'] ) ) {
                    $setting[ $key ]['dependency'] = array(
                        array(
                            'field'    => $field['dependency']['element'],
                            'operator' => 'in',
                            'value'    => $field['dependency']['value']
                        )
                    );
                }

                if ( 'true' === $field['dependency']['value'] || 'false' === $field['dependency']['value'] ) {
                    $setting[ $key ]['dependency'] = array(
                        array(
                            'field'    => $field['dependency']['element'],
                            'operator' => '==',
                            'value'    => $field['dependency']['value'] ? true : false,
                        )
                    );
                }
            }

            $setting[ $key ]['multiple']  = isset( $field['multiple'] ) ? $field['multiple'] : 1;
            $setting[ $key ]['ajax']      = isset( $field['ajax'] ) ? $field['ajax'] : '';
            $setting[ $key ]['nonce']     = isset( $field['nonce'] ) ? $field['nonce'] : '';
            $setting[ $key ]['value']     = $this->get_value( $field['param_name'], $instance, $setting[ $key ]['default'] );
            $setting[ $key ]['fields']    = isset( $field['fields'] ) ? $field['fields'] : array();
            $setting[ $key ]['row_label'] = isset( $field['row_label'] ) ? $field['row_label'] : array();


            // only for image type
            if ( 'image' === $setting[ $key ]['type'] ) {
                $image = wp_get_attachment_image_src( $setting[ $key ]['value'], 'full' );
                if ( isset( $image[0] ) ) {
                    $setting[ $key ]['imageUrl'] = $image[0];
                }
            }
        }

        return $setting;
    }

    /**
     * Get menu default value
     *
     * @param string $id Key of field option.
     * @param array $value Array of value.
     * @param mixed $default Default value for this item.
     *
     * @return mixed
     */
    public function get_value( $id, $value, $default ) {
        return isset( $value[ $id ] ) ? $value[ $id ] : $default;
    }

    /**
     * Script template for shortcode generator
     */
    public function template_script() {
        ?>
        <div class="shortcode-popup-list-wrapper shortcode-tab" id="shortcode-popup-list-wrapper"></div>
        <div class="shortcode-option-wrapper shortcode-tab" id="shortcode-option-wrapper"></div>
        <script type="text/html" id="tmpl-shortcode-popup">
            <div class="popup-shortcode-list">
                <div class="popup-header">
                    <h2>{{ data.header }}</h2>
                    <span class="close">
						<i class="fa fa-close"></i>
					</span>
                </div>
                <div class="popup-body">
                    <ul class="tabbed-list"></ul>
                    <div class="tabbed-body popup-content"></div>
                </div>
            </div>
        </script>
        <script type="text/html" id="tmpl-shortcode-category-list">
            <# var active = ( data.index === 0 ) ? 'active' : ''; #>
            <li href="#{{ data.id }}" class="{{ active }}"><span>{{ data.text }}</span></li>
        </script>
        <script type="text/html" id="tmpl-shortcode-category">
            <# var active = ( data.index === 0 ) ? 'active' : ''; #>
            <div class="jeg_tabbed_body {{ data.id }} {{ active }}" id="{{ data.id }}">
                <div class="jeg_metabox_body"></div>
            </div>
        </script>
        <script type="text/html" id="tmpl-shortcode-item">
            <div class="element">
                <div class="element-wrapper">
                    <i class="{{ data.id }}"></i>
                </div>
                <span>{{ data.name }}</span>
            </div>
        </script>
        <script type="text/html" id="tmpl-shortcode-option">
            <div class="popup-shortcode-option">
                <div class="popup-header">
                    <h2>{{ data.header }}</h2>
                    <span class="close">
						<i class="fa fa-close"></i>
					</span>
                </div>
                <div class="popup-body">
                    <ul class="tabbed-list"></ul>
                    <div class="tabbed-body popup-content"></div>
                </div>
                <div class="popup-footer">
                    <div class="close">{{ data.close }}</div>
                    <div class="generate">{{ data.generate }}</div>
                </div>
            </div>
        </script>
        <?php
    }

}
