<?php
namespace MetForm\Core\Entries;

defined('ABSPATH') || exit;

Class Map_El {

    /**
     * @var array
     */
    private $_el = [];
    /**
     * @var mixed
     */
    private $_el_list;

    /**
     * @var mixed
     */
    private static $instance;

    /**
     * @param $data
     * @param $el_list
     */
    public static function data($data, $el_list) {
        self::$instance = new self($data, $el_list);
        return self::$instance;
    }

    /**
     * @param $data
     * @param $el_list
     * @return mixed
     */
    public function __construct($data, $el_list) {
        $this->_el_list = $el_list;
        $this->search_el($data);
        return $this;
    }

    /**
     * @return mixed
     */
    public function get_el() {
        return $this->_el;
    }

    /**
     * @param $data
     * @return null
     */
    private function search_el($data) {
        if (!is_array($data)) {
            return;
        }

        foreach ($data as $k => $v) {
            if (is_array($v->elements) && !empty($v->elements)) {
                $this->search_el($v->elements);
            } else {
                if ($v->elType == 'widget' && in_array(str_replace('[]', '', $v->widgetType), $this->_el_list)) {

                    if (isset($v->settings->mf_input_name)) {
                        $this->_el[$v->settings->mf_input_name]             = $v->settings;
                        $this->_el[$v->settings->mf_input_name]->widgetType = $v->widgetType;
                    } else {
                        $this->_el[$v->widgetType] = (object) [
                            'mf_input_label'                 => (isset($v->settings->mf_input_label) ? $v->settings->mf_input_label : ''),
                            'mf_input_name'                  => (isset($v->widgetType) ? $v->widgetType : ''),
                            'mf_input_placeholder'           => (isset($v->settings->mf_input_placeholder) ? $v->settings->mf_input_placeholder : ''),
                            'mf_input_min_length'            => (isset($v->settings->mf_input_min_length) ? $v->settings->mf_input_min_length : ''),
                            'mf_input_max_length'            => (isset($v->settings->mf_input_max_length) ? $v->settings->mf_input_max_length : ''),
                            'mf_input_length_type'           => (isset($v->settings->mf_input_length_type) ? $v->settings->mf_input_length_type : ''),
                            'mf_input_validation_expression' => (isset($v->settings->mf_input_validation_expression) ? $v->settings->mf_input_validation_expression : ''),
                            'widgetType'                     => (isset($v->widgetType) ? $v->widgetType : '')
                        ];
                    }
                } elseif (!empty($v->widgetType) && $v->widgetType === 'mf-button') {

                    if (!empty($v->settings->mf_hidden_input) && is_array($v->settings->mf_hidden_input)) {

                        foreach ($v->settings->mf_hidden_input as $value) {
                            $this->_el[$value->mf_hidden_input_name] = (object) [
                                'mf_input_label' => (isset($value->mf_hidden_input_name) ? ucwords(str_replace(['-', '_'], ' ', $value->mf_hidden_input_name)) : ''),
                                'mf_input_name'  => (isset($value->mf_hidden_input_name) ? $value->mf_hidden_input_name : ''),
                                'widgetType'     => (isset($v->widgetType) ? $v->widgetType : '')
                            ];
                        }
                    }
                }

                /**
                 * The map widget submits two extra hidden fields ({name}_lat, {name}_lng)
                 * that aren't a real Elementor widget of their own, so they need to be
                 * registered here too, otherwise entries/action.php::sanitize() drops them.
                 */
                if (!empty($v->widgetType) && $v->widgetType === 'mf-map-location' && isset($v->settings->mf_input_name)
                    && isset($v->settings->mf_map_show_map) && $v->settings->mf_map_show_map === 'yes') {

                    $lat_name = $v->settings->mf_input_name . '_lat';
                    $lng_name = $v->settings->mf_input_name . '_lng';

                    $this->_el[$lat_name] = (object) [
                        'mf_input_label' => (isset($v->settings->mf_input_label) ? $v->settings->mf_input_label . ' (Latitude)' : 'Latitude'),
                        'mf_input_name'  => $lat_name,
                        'widgetType'     => $v->widgetType,
                    ];

                    $this->_el[$lng_name] = (object) [
                        'mf_input_label' => (isset($v->settings->mf_input_label) ? $v->settings->mf_input_label . ' (Longitude)' : 'Longitude'),
                        'mf_input_name'  => $lng_name,
                        'widgetType'     => $v->widgetType,
                    ];
                }
            }
        }
    }

}