<?php
/**
 * @package SP Page Builder
 * @author JoomShaper http://www.joomshaper.com
 * @copyright Copyright (c) 2010 - 2023 JoomShaper
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
*/

/**
 * SP Page Builder settings ajax loader
 *
 * @since version 2.0
 */
defined ('_JEXEC') or die ('Restricted access');

class SppbSettingsAjax {

	/**
	 * Ajax Request Settings type
	 * @since 2.0
	 * @access private
	 * @var strings
	 */
	private $type 			= '';


	private $addon_raw;


	/**
	 * Current Row Index
	 * @since 2.0
	 * @access private
	 * @var intiger
	 */
	private $row_index;

	/**
	 * Current Column Index
	 * @since 2.0
	 * @access private
	 * @var intiger
	 */
	private $column_index;

	/**
	 * Current Addon Index
	 * @since 2.0
	 * @access private
	 * @var intiger
	 */
	private $addon_index;

	/**
	 * Current Addon Index
	 * @since 2.0
	 * @access private
	 * @var intiger
	 */
	private $addon_name;

	/**
	 * Current Addon Index
	 * @since 2.0
	 * @access private
	 * @var array
	 */
	private $settings 		= array();

	/**
	 * Current Addon Index
	 * @since 2.0
	 * @access private
	 * @var array
	 */
	private $options 		= array();

	/**
	 * Current Addon Index
	 * @since 2.0
	 * @access private
	 * @var bool
	 */
	private $error 			= false;
	private $addons 		= array();

	/**
	 * Construct
	 */

	function __construct( $post, $default ) {
		$post = isset($post) ? $post : [];
		if (isset($post['type'])) {
			$this->type = $post['type'];
		}

		if (isset($post['settings'])) {
			$this->settings = $post['settings'];
		}

		if (isset($post['rowIndex'])) {
			$this->row_index = $post['rowIndex'];
		}

		if (isset($post['colIndex'])) {
			$this->column_index = $post['colIndex'];
		}

		if (isset($post['addonIndex'])) {
			$this->addon_index = $post['addonIndex'];
		}

		if (isset($post['addonName'])) {
			$this->addon_name = $post['addonName'];
		}

		if ( $this->type === 'row' || $this->type === 'inner_row' ) {
		 	$this->options = $default['attr'];
		} else if ( $this->type === 'column' || $this->type === 'inner_column' ) {
		 	$this->options = $default['attr'];
		} else if ( $this->type === 'addon' || $this->type === 'inner_addon') {
			$this->options = $default[$this->addon_name]['attr'];
			$this->addon_raw = $default[$this->addon_name];
		} else if ( $this->type === 'list' ) {
			$this->addons = $default;
		}
	}

	/**
	 * Ajax request call back
	 * @since 2.0
	 * @return JSON
	 */
	public function get_ajax_request() {
		$result = new stdClass;

		if ($this->type === 'list') {
			$result->categories = $this->get_addon_categories($this->addons);
		}

		$result->type = $this->type;
		$result->rowIndex 		= $this->row_index;
		$result->columnIndex 	= $this->column_index;
		$result->addonIndex 	= $this->addon_index;
		$result->addonName 		= $this->addon_name;
		$result->data 	 			= $this->get_settings_result();
		$result->status       = true;

		return json_encode($result);
	}

	/**
	 * Get settings data
	 * @since 2.0
	 * @access private
	 * @return array|string
	 */
	private function get_addon_categories($addons){
		$categories = array();
		foreach ($addons as $addon) {
			if (isset($addon['category'])) {
				$categories[] = $addon['category'];
			}
		}
		$new_array = array_count_values($categories);

		$result[0]['name'] = 'All';
		$result[0]['count'] = count((array) $addons);
		if (count((array) $new_array)) {
			$i = 1;
			foreach ($new_array as $key => $row) {
				$result[$i]['name'] = $key;
				$result[$i]['count'] = $row;
				$i = $i + 1;
			}
		}

		return $result;
	}

	/**
	 * Get settings data
	 * @since 2.0
	 * @access private
	 * @return array|string
	 */
	private function get_settings_result() {
		 switch ($this->type)
		 {
		 	case 'list':
		 			return $this->get_addons_array_list();
		 		break;

		 	case 'row':
		 	case 'column':
		 	case 'addon':
		 	case 'inner_row':
		 	case 'inner_column':
		 	case 'inner_addon':
			 	return $this->get_inputs_output_html();
		 		break;

		 	default:
		 		return 'No related settings found';
		 		break;
		 }
	}

	/**
	 * Array of addons list
	 * @since 2.0
	 * @access private
	 * @return array
	 */
	private function get_addons_array_list() {
		return array_values($this->addons);
	}

	/**
	 * HTML of row/column/addons settings inputs
	 * @since 2.0
	 * @access private
	 * @return string
	 */
	private function get_inputs_output_html() {
		$i = 0;
		$j = 0;

		$addon_title = $this->addon_raw['title'];
		$fieldsets = array();
		foreach ($this->options as $key => $option) {
				$fieldsets[$key] = $option;
		}

		$output = '';

		if(count((array) $fieldsets)) {
			$output .= '<div class="sp-pagebuilder-fieldset">';
			$output .= '<ul class="sp-pagebuilder-nav sp-pagebuilder-nav-tabs">';
			foreach ( $fieldsets as $key => $value ) {
				$output .= '<li class="'. (( $i === 0 )?"active":"" ) .'"><a href="#sp-pagebuilder-tab-'. $key .'"  aria-controls="'. $key .'" data-toggle="tab">'. ucfirst( $key ) .'</a></li>';
				$i++;
			}
			$output .= '</ul>';
			$output .= '<div class="tab-content">';
			foreach ( $fieldsets as $key => $value ) {
				$output .= '<div class="tab-pane '. (( $j === 0 )? "active":"" ) .'" id="sp-pagebuilder-tab-'. $key .'">';
				$output .= $this->get_input_fields( $key, $addon_title );
				$output .= '</div>';

				$j++;
			}
			$output .= '</div>';
			$output .= '</div>';
		}

		return $output;
	}

	/**
	 * Get input fileds
	 * @since 2.0
	 * @access private
	 * @return string
	 */
	private function get_input_fields( $filedset = '', $title = '') {
		if (!$filedset) return;

		$options = $this->options;

		$output = '';
		foreach ( $options[$filedset] as $key => $option ) {
			if ( isset( $option['attr'] ) && is_array( $option['attr'] ) ) {
				$output .= $this->get_grouped_input_fields( $key, $option, $title );
			} else {
				if ( isset( $this->settings[ $key ] ) ) {
					$option['std'] = $this->settings[ $key ];
				}
				$output .= '<div class="sp-pagebuilder-parent-input-field" data-addon_title="'. $title . '">';
				$output .= $this->get_input_field_html( $key, $option );
				$output .= '</div>';
			}
		}

		return $output;
	}

	/**
	 * Input filed based on type
	 * @since 2.0
	 * @access private
	 * @return string
	 */
	private function get_input_field_html($name, $options) {
		$class_name = 'SpType' . ucfirst($options['type']);
		return $class_name::getInput($name, $options);
	}

	/**
	 * Grouped input filed generator
	 * @since 2.0
	 * @access private
	 * @return string
	 */
	private function get_grouped_input_fields( $name, $options, $title = '' ) {
		$grouped = array();
		if (isset($this->settings[$name])) {
			$grouped = $this->settings[$name];
		} elseif (isset($options['addon_name']) && $options['addon_name']) {
			$name = $options['addon_name'];
			if (isset($this->settings[$name])) {
				$grouped = $this->settings[$name];
			}
		}
		$count = count((array) $grouped);

		if ($count <= 0) {
			$count = 1;
		}
		$output = '';

		if(isset($options['title']) && $options['title'] != '') {
			$output .= '<div class="sp-pagebuilder-grouped-wrap sp-pagebuilder-parent-input-field sp-pagebuilder-has-group-title" data-addon_title="'. $title . '" data-field_name="'. $name .'">';
		} else {
			$output .= '<div class="sp-pagebuilder-grouped-wrap sp-pagebuilder-parent-input-field" data-addon_title="'. $title . '" data-field_name="'. $name .'">';
		}

		if(isset($options['title']) && $options['title'] != '') {
			$output .= '<h4 class="sp-pagebuilder-group-title">' . $options['title'] . '</h4>';
		}

		$output .= '<a href="#" class="sp-pagebuilder-add-grouped-item sp-pagebuilder-btn sp-pagebuilder-btn-warning sp-pagebuilder-btn-sm"><i class="fa fa-plus"></i> Add New</a>';
		$output .= '<div class="sp-pagebuilder-grouped sp-pagebuilder-grouped-items grouped-'.$name.'" data-field_no="'. ($count - 1) .'">';
		for($i = 0; $i < $count; $i++) {

			$output .= '<div class="sp-pagebuilder-grouped-item">';
			$output .= '<div class="sp-pagebuilder-repeatable-toggler">';
			$output .= '<span class="sp-pagebuilder-move-repeatable"><i class="fa fa-ellipsis-v"></i></span>';
			$output .= '<h4 class="sp-pagebuilder-repeatable-item-title">Item '. ($i+1) .'</h4>';
			$output .= '<span class="sp-pagebuilder-remove-grouped-item"><a href="#"><i class="fa fa-times"></i></a></span>';
			$output .= '<span class="sp-pagebuilder-clone-grouped-item"><a href="#"><i class="fa fa-clone"></i></a></span>';
			$output .= '</div>';

			$output .= '<div class="sp-pagebuilder-grouped-item-collapse" style="display:none;">';
			foreach ( $options['attr'] as $key => $option ) {
				if ( isset( $grouped[$i][$key] ) ) {
					$option['std'] = $grouped[$i][$key];
				}

				$key = $name. '['. $i .']['. $key .']';
				$output .= '<div class="sp-pagebuilder-repeatable-input-field">';
				$output .= $this->get_input_field_html( $key, $option );
				$output .= '</div>';
			}
			$output .= '</div>';
			$output .= '</div>';
		}

		$output .= '</div>';
		$output .= '</div>';

		return $output;
	}
}
