<?php

/**
 * HTML Output functions for admin.
 */
class WJECF_Admin_Html
{
    /**
     * 2.3.6
     * Renders a <SELECT> that has a default value. Relies on woocommerce_wp_select.
     *
     * field['default_value']:  The default value (if omitted the first option will be default)
     * field['append_default_label']: If true or omitted the text '(DEFAULT)' will be appended to the default option caption
     *
     * @param array $field see wc-meta-box-functions.php:woocommerce_wp_select
     */
    public static function render_select_with_default($field)
    {
        global $thepostid, $post;
        $thepostid = empty($thepostid) ? $post->ID : $thepostid;

        reset($field['options']); // move to first for key()
        $default_value = $field['default_value'] ?? key($field['options']);
        $append_default_label = $field['append_default_label'] ?? true;

        if ($append_default_label) {
            // translators: 1: Default value
            $field['options'][$default_value] = sprintf(__('%s (Default)', 'woocommerce-jos-autocoupon'), $field['options'][$default_value]);
        }

        if (!isset($field['value'])) {
            $field['value'] = get_post_meta($thepostid, $field['id'], true);
        }
        if (empty($field['value'])) {
            $field['value'] = $default_value;
        }

        woocommerce_wp_select($field);
    }

    public static function render_admin_cat_selector($dom_id, $field_name, $selected_ids, $placeholder = null)
    {
        if (is_null($placeholder)) {
            $placeholder = __('Search for a product…', 'woocommerce');
        }

        // Categories
        ?>
		<select id="<?php echo esc_attr($dom_id); ?>" name="<?php echo esc_attr($field_name); ?>[]" style="width: 50%;"  class="wc-enhanced-select" multiple="multiple" data-placeholder="<?php echo esc_attr($placeholder); ?>">
			<?php
                $categories = get_terms('product_cat', 'orderby=name&hide_empty=0');

        if ($categories) {
            foreach ($categories as $cat) {
                echo '<option value="'.esc_attr($cat->term_id).'"'.selected(in_array($cat->term_id, $selected_ids), true, false).'>'.esc_html($cat->name).'</option>';
            }
        }
        ?>
		</select>
		<?php
    }

    /**
     * Display a WooCommerce help tip.
     *
     * @param string $tip The tip to display
     *
     * @return string
     */
    public static function wc_help_tip($tip)
    {
        // Since WC 2.5.0
        if (function_exists('wc_help_tip')) {
            return wc_help_tip($tip);
        }

        return '<img class="help_tip" style="margin-top: 21px;" data-tip="'.esc_attr($tip).'" src="'.esc_url(WC()->plugin_url()).'/assets/images/help.png" height="16" width="16" />';
    }

    /**
     * Renders a product selection <input>. Will use either select2 v4 (WC3.0+) select2 v3 (WC2.3+) or chosen (< WC2.3).
     *
     * @param string      $dom_id
     * @param string      $field_name
     * @param array       $selected_ids Array of integers
     * @param null|string $placeholder
     */
    public static function render_admin_product_selector($dom_id, $field_name, $selected_ids, $placeholder = null)
    {
        $product_key_values = [];
        foreach ($selected_ids as $product_id) {
            $product = wc_get_product($product_id);
            if (is_object($product)) {
                $product_key_values[esc_attr($product_id)] = wp_kses_post($product->get_formatted_name());
            }
        }

        if (is_null($placeholder)) {
            $placeholder = __('Search for a product…', 'woocommerce');
        }

        // In WooCommerce version 3.0 select2 v3 was replaced by select2 v4
        self::render_admin_select2_v4_product_selector($dom_id, $field_name, $product_key_values, $placeholder);
    }

    /**
     * Renders a customer selection <input>. Will use either select2 v4 (WC3.0+) or select2 v3 (WC2.3+).
     *
     * @param string      $dom_id
     * @param string      $field_name
     * @param array       $selected_customer_ids Array of integers
     * @param null|string $placeholder
     */
    public static function render_admin_customer_selector($dom_id, $field_name, $selected_customer_ids, $placeholder = null)
    {
        $selected_keys_and_values = [];
        foreach ($selected_customer_ids as $customer_id) {
            $customer = get_userdata($customer_id);
            if (is_object($customer)) {
                $selected_keys_and_values[$customer_id] = $customer->display_name.' (#'.$customer->ID.' &ndash; '.sanitize_email($customer->user_email).')';
            }
        }
        if (is_null($placeholder)) {
            $placeholder = __('Any customer', 'woocommerce-jos-autocoupon');
        }

        // In WooCommerce version 3.0 select2 v3 was replaced by select2 v4
        self::render_admin_select2_v4_customer_selector($dom_id, $field_name, $selected_keys_and_values, $placeholder);
    }

    // ============================================
    // Simple html output

    /**
     * Renders a <input type='text' />
     * $args should be an array in this form:
     *  [ 'type' => 'text', name' => 'field-name', 'id' => 'dom-id', 'value' => 'value', 'class' => 'css-class' ].
     *
     * @param array $args
     */
    public static function render_input($args)
    {
        if (!isset($args['type'])) {
            throw new Exception('Type field is obligatory.');
        }

        $fields = [];

        switch ($args['type']) {
            case 'text':
                $fields['type'] = 'text';
                if (isset($args['value'])) {
                    $fields['value'] = esc_attr($args['value']);
                }

                break;

            case 'hidden':
                $fields['type'] = 'hidden';
                if (isset($args['value'])) {
                    $fields['value'] = esc_attr($args['value']);
                }

                break;

            case 'radio':
                $fields['type'] = 'radio';
                if (isset($args['checked']) && $args['checked']) {
                    $fields['checked'] = esc_attr($args['checked']);
                }
                if (isset($args['disabled']) && $args['disabled']) {
                    $fields['disabled'] = 'disabled';
                }

                if (isset($args['value'])) {
                    $fields['value'] = esc_attr($args['value']);
                }

                break;

            case 'checkbox':
                $fields['type'] = 'checkbox';
                if (isset($args['disabled']) && $args['disabled']) {
                    $fields['disabled'] = 'disabled';
                }

                $fields['value'] = $args['cbvalue'] ?? 'yes';
                if (isset($args['value']) && (string) $args['value'] === (string) $fields['value']) {
                    $fields['checked'] = 'checked';
                }

                if (!empty($field['description']) && false === $field['desc_tip']) {
                    echo '<span class="description">'.wp_kses_post($field['description']).'</span>';
                }

                break;

            default:
                throw new Exception(sprintf('Unknown field type "%s" is obligatory.', $args['type']));
        }

        // var_dump($args);
        if (isset($args['name'])) {
            $fields['name'] = esc_attr($args['name']);
        }
        if (isset($args['id'])) {
            $fields['id'] = esc_attr($args['id']);
        }
        if (isset($args['class'])) {
            $fields['class'] = esc_attr($args['class']);
        }

        self::render_tag('input', $fields);
    }

    /**
     * Renders a html tag:
     * e.g. <name field="value">contents</name>
     *
     * This function does not escape the fields! Keys must be valid attribute names and values MUST be properly escaped!!!
     *
     * @param string      $name
     * @param array       $fields   E.g. [ 'class' => 'clearfix' ] yields: class="clearfix"
     * @param null|string $contents If null the html tag will be self closing
     */
    public static function render_tag($name, $fields = [], $contents = null)
    {
        echo self::tag($name, $fields, $contents);
    }

    /**
     * Returns a html tag:
     * e.g. <name field="value">contents</name>
     *
     * This function does not escape the fields! Keys must be valid attribute names and values MUST be properly escaped!!!
     *
     * @param string      $name
     * @param array       $fields   E.g. [ 'class' => 'clearfix' ] yields: class="clearfix"
     * @param null|string $contents If null the html tag will be self closing
     *
     * @return string
     */
    protected static function tag($name, $fields = [], $contents = null)
    {
        if (is_null($contents)) {
            return sprintf('<%s %s/>', $name, self::extract_attributes($fields));
        }

        return sprintf('<%s %s>%s</%s>', $name, self::extract_attributes($fields), $contents, $name);
    }

    /**
     * Extracts fields to attributes for html tags.
     * E.g. [ 'class' => 'clearfix' ] yields: class="clearfix".
     *
     * This function does not escape the fields! Keys must be valid attribute names and values MUST be properly escaped!!!
     *
     * @param array $fields
     *
     * @return string
     */
    protected static function extract_attributes($fields)
    {
        // NOTE: attrib and value MUST be properly escaped!!!
        $extracted = '';
        foreach ($fields as $field => $value) {
            $extracted .= sprintf('%s="%s" ', $field, $value);
        }

        return $extracted;
    }

    /**
     * Renders a product selection <input>.
     * Select2 version 4 (Since WC 3.0).
     *
     * @param string $dom_id
     * @param string $field_name
     * @param string $selected_keys_and_values
     * @param string $placeholder
     */
    private static function render_admin_select2_v4_product_selector($dom_id, $field_name, $selected_keys_and_values, $placeholder)
    {
        // $selected_keys_and_values must be an array of [ id => name ]

        $json_encoded = esc_attr(json_encode($selected_keys_and_values));

        echo '<select id="'.esc_attr($dom_id).'" class="wc-product-search" name="'
        .esc_attr($field_name).'[]" multiple="multiple" style="width: 50%;" data-placeholder="'
        .esc_attr($placeholder).'" data-action="woocommerce_json_search_products_and_variations">';

        foreach ($selected_keys_and_values as $product_id => $product_name) {
            echo '<option value="'.esc_attr($product_id).'"'.selected(true, true, false).'>'.wp_kses_post($product_name).'</option>';
        }

        echo '</select>';
    }

    private static function render_admin_select2_v4_customer_selector($dom_id, $field_name, $selected_keys_and_values, $placeholder)
    {
        // $selected_keys_and_values must be an array of [ id => name ]

        $json_encoded = esc_attr(json_encode($selected_keys_and_values));

        echo '<select id="'.esc_attr($dom_id).'" class="wc-customer-search" name="'
        .esc_attr($field_name).'[]" multiple="multiple" style="width: 50%;" data-placeholder="'
        .esc_attr($placeholder).'" data-action="woocommerce_json_search_customers">';

        foreach ($selected_keys_and_values as $key => $value) {
            echo '<option value="'.esc_attr($key).'"'.selected(true, true, false).'>'.wp_kses_post($value).'</option>';
        }

        echo '</select>';
    }
}
