<?php 

/**
 * ProcessWire General site settings module
 *
 * Allows to set global site settings 
 *
 * by Piotr Markiewicz (pmarki)
 *
 * ProcessWire 2.8.x (development), Copyright 2016 by Ryan Cramer
 * https://processwire.com
 *
 *
 */

class ProcessGeneralSettings extends \ProcessWire\Process implements \ProcessWire\Module {

	public static function getModuleInfo() {
		return array(
			'title' => \ProcessWire\__('General site settings (Process)', 'C:/webpages/creative/site/modules/ProcessGeneralSettings/ProcessGeneralSettings.module'),
			'summary' => \ProcessWire\__('Editing of global site settings, setup in General Settings Module', 'C:/webpages/creative/site/modules/ProcessGeneralSettings/ProcessGeneralSettings.module'),
			'version' => 122,
			'permanent' => false, 
			'autoload' => true,
			'icon' => 'sliders', 
			//'requires' => 'GeneralSettings',
			'installs'	=> 'GeneralSettings',
			'page' => array(
				'name' => 'general-settings',
				'parent' => 'setup',
				'title' => 'General settings',
				),
			'permission' => 'general-settings',
			"permissions" => ["general-settings" => "Access general settings page"],
			);
	}

	/**
	 * Initialize
	 *
	 */

	public function init() {
		$this->data = $this->modules->getConfig('GeneralSettings');
	}


	public function ___execute() {

		if ($this->input->post('submit_save')) {
			return $this->renderForm($this->saveValues());
			//wire('session')->redirect(\ProcessWire\wire('page')->url);
		} else {
			return $this->renderForm();
		}
	}

	/**
	 * Render form for admin page
	 * 
	 * @return string form markup
	 *
	 */
	protected function renderForm($settings=null) {

		if (!isset($this->data['settings'])) {
			return 'Create settings in module configuration first.';
		}

		$data = $this->data;

		$attrs = json_decode( $settings ?:$data['settings'], true);
		if ($attrs === null) {
			return 'Error decoding settings data.';
		}

		$form = $this->modules->get('InputfieldForm'); 
		$form->attr('id', 'SettingsModule');
		$form->attr('action', $this->wire('page')->url );

		$parent = $form;
		foreach ($attrs as $fset) {
			$field = $this->modules->get('Inputfield'.$fset['type']);
			$value = (isset($fset['value']) ? $fset['value'] : '');

			//------- NEW --------
			if($fset['type'] == 'FieldsetClose') {
				$parent = $form;
				continue;
			}
			//------- END NEW --------

			if (!$field) {
				$this->message('Unable to find field type ' .$fset['type']);
				continue;
			}
			//set attrbs for all type of fields
			$field->label = $fset['label'];
			$field->columnWidth = (intval($fset['width']) >=10) ? $fset['width'] : 100;
			$field->description = $fset['description'];

			//------- NEW --------

			// Placeholder
			$field->placeholder = isset($fset['placeholder']) ? $fset['placeholder'] : '';

			// Collapsed
			if(isset($fset['collapsed']) && $fset['collapsed'] != 'Default') {
				if($fset['collapsed'] == 'collapsedNever') $field->collapsed = \ProcessWire\Inputfield::collapsedNever;
				if($fset['collapsed'] == 'collapsedBlank') $field->collapsed = \ProcessWire\Inputfield::collapsedBlank;
				if($fset['collapsed'] == 'collapsedYes') $field->collapsed = \ProcessWire\Inputfield::collapsedYes;
			}

			// Markup
			if ($fset['type'] == 'Markup') {
				$field->markupText = '<p>' . $fset['description'] . '</p>';
				$field->description = '';
			}

			//------- END NEW --------

			if ($fset['type'] == 'Checkbox') {
				$field->uncheckedValue = '0';
				if($value === '1') {
					$field->setAttribute('checked', 'checked'); 
				}
			}
			if ($fset['type'] == 'URL') {
				$field->set('noRelative', 1);
			}

			// enabled use of checkboxes
			if ($fset['type'] == 'Select' || $fset['type'] == 'Radios' || $fset['type'] == 'Checkboxes') {
				foreach (explode(',', trim($fset['select'], ',')) as $label) {
					//value, label, attr
					$v = $this->wire('sanitizer')->name($label);
					if ($value == $v) {
						$field->addOption($v, $label, array('selected' => 1));
					} else {
						$field->addOption($v, $label);
					}
				}
			}
			if ($fset['type'] == 'Integer') {
				$field->setAttribute('type', 'number');
			}

			//fieldset or normal field
			if ($fset['type'] == 'Fieldset') {
				$field->addClass('fset_red');
				$parent = $field;
				$form->append($field);
			} else {
				$field->attr('name', $fset['api']);
				$field->attr('value', $value); 
				$parent->append($field);
			}

		}


		$f = $this->modules->get('InputfieldSubmit'); 
		$f->attr('name', 'submit_save'); 
		$f->attr('value', $this->_('Save')); 
		$f->addClass('head_button_clone');
		$f->icon = 'save';

		$form->add($f);

		return $form->render();
	}

	/**
	 * Save values provided by user to module config data
	 * 
	 */
	protected function saveValues() {

		$old = $this->data;
		$data = json_decode($old['settings'], true);
		$new = array();
		foreach ($data as $key => $field) {
			$new[$key] = $field;
			$new[$key]['value'] = $this->wire('input')->{$field['api']};
		}
		$old['settings'] = json_encode($new);
		\ProcessWire\wire('modules')->saveConfig('GeneralSettings', $old);
		$this->message('Site settings saved');	
		return $old['settings'];
	}



}
