<?php

App::uses('ApiController', 'Controller');
App::uses('Api', 'Model');

include_once 'AjaxTrait.php';

class OcenyController extends ApiController
{

	use AjaxTrait;

	public function daj_pracownikow_oceny()
	{
		$this->view = 'modal_oceny';

		$resp = $this->Api->DajAdresy($this->_getGid());
		$address = [];

		if (isset($resp['bAdresy']['bAdres'][0])) {
			$address['address'] = $resp['bAdresy']['bAdres'];
		} elseif (isset($resp['bAdresy']['bAdres'])) {
			$address['address'] = [$resp['bAdresy']['bAdres']];
		} else {
			$address['address'] = [];
		}

		$rjson = $this->_handle_response_json($resp);

		if (isset($rjson['login']) && !empty($rjson['login'])) {
			echo 'login';
			die();
		}

		return $address;
	}

	public function daj_formularze_oceny($tab = null, $archive = null)
	{
		$this->view = 'tabs';

		if ($tab === null) {
			$tab = $this->request->query('tab') ?: 'moje';
		}

		if ($archive === null) {
			$archive = $this->request->query('archive') ?: 0;
		}

		$resp = $this->Api->DajAktywneZakladki($this->_getGid());

		if (isset($rjson['login']) && !empty($rjson['login'])) {
			echo 'login';
			die();
		}

		$allow_tabs = [
			'moje' => true,
			'pracownikow' => $resp['bCzyMoichPracownikow'] == 'true' ?: false,
			'udostepnione' => $resp['bCzyUdostepnione'] == 'true' ?: false,
			'robocze' => $resp['bCzyRobocze'] == 'true' ?: false,
			'administracja' => $resp['bCzyAdministracja'] == 'true' ?: false,
			'administracja_robocze' => $resp['bCzyAdministracjaRobocze'] == 'true' ?: false
		];

		$this->set(compact('tab', 'allow_tabs', 'archive'));
	}

	public function lista_moje()
	{
		$this->view = 'table';

		$options = [
			'filter' => 'Moje',
			'archive' => $this->request->query('archive') ? 'true' : 'false',
			'tab' => 'moje',
		];

		$items = $this->lista($options);

		$tab = 'moje';
		$this->set(compact('items', 'tab'));
	}

	public function lista_pracownikow()
	{
		$this->view = 'table';

		$options = [
			'filter' => 'MoichPracownikow',
			'archive' => $this->request->query('archive') ? 'true' : 'false',
			'tab' => 'pracownikow',
		];

		$items = $this->lista($options);

		$tab = 'pracownikow';
		$this->set(compact('items', 'tab'));
	}

	public function lista_udostepnione()
	{
		$this->view = 'table';

		$options = [
			'filter' => 'DlaMnieUdostepnione',
			'archive' => $this->request->query('archive') ? 'true' : 'false',
			'tab' => 'udostepnione',
		];

		$items = $this->lista($options);

		$tab = 'udostepnione';
		$this->set(compact('items', 'tab'));
	}

	public function lista_robocze()
	{
		$this->view = 'table';

		$options = [
			'filter' => 'Robocze',
			'archive' => $this->request->query('archive') ? 'true' : 'false',
			'tab' => 'robocze',
		];

		$items = $this->lista($options);

		$tab = 'robocze';
		$this->set(compact('items', 'tab'));
	}

	public function lista_administracja()
	{
		$this->view = 'table';

		$options = [
			'filter' => 'Administracja',
			'archive' => $this->request->query('archive') ? 'true' : 'false',
			'tab' => 'administracja',
		];

		$items = $this->lista($options);

		$tab = 'administracja';
		$this->set(compact('items', 'tab'));
	}

	public function lista_administracja_robocze()
	{
		$this->view = 'table';

		$options = [
			'filter' => 'AdministracjaRobocze',
			'archive' => $this->request->query('archive') ? 'true' : 'false',
			'tab' => 'administracja_robocze',
		];

		$items = $this->lista($options);

		$tab = 'administracja_robocze';
		$this->set(compact('items', 'tab'));
	}

	private function lista($options = [])
	{
		/*<xs:simpleType name="FiltryFormularzaOceny">
		<xs:restriction base="xs:string">
		<xs:enumeration value="Brak"/>
		<xs:enumeration value="Moje"/>
		<xs:enumeration value="MoichPracownikow"/>
		<xs:enumeration value="DlaMnieUdostepnione"/>
		</xs:restriction>
		</xs:simpleType>*/

		if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? '')))) {
			if (!empty($this->Session->read('FormularzeOcenyItemczyUMC_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? '')))) {
				$this->set('czyUMC', $this->Session->read('FormularzeOcenyItemczyUMC_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? '')));
			}
			$this->set(['CzyMozeDodawac' => $this->Session->read('FormularzeOcenyItemsCzyMozeDodawac_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''))]);
			return $this->Session->read('FormularzeOcenyItems_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''));
		}

		$resp = $this->Api->DajFormularzeOceny($this->_getGid(), $options);

		if (isset($resp['bFormularzeOceny']['bFormularzOceny'][0])) {
			$items = [];
			foreach ($resp['bFormularzeOceny']['bFormularzOceny'] as $item) {
				foreach ($item as $key => $elem) {
					if (in_array($key, ['bRodzaj',
						'bDataOceny',
						'bOkresOcenyOd',
						'bOkresOcenyDo',
						'bNazwa',
						'bAdresOcenianego',
						'KomorkaKod',
						'bAdresTworcy',
						'bOcena',
						'bDataZapoznaniaSie',
						'bDataOdwolania',
						'bCzyZaakceptowany',
						'bInformacjaOOdwolaniu',
						'bStatusOdwolania',
						'bCzyMozeSieZapoznac',
						'bCzyMozeAktualizowacTworceOceny',
						'bCzyMozeAktualizowacPrzelozonychOceny',
						'bCzyMozeZatwierdzic',
						'bCzyMozeZdjecZatwierdzenie',
						'bCzyMozePrzegladac',
						'bCzyMozeEdytowac',
						'bCzyMozeUsunac',
						'bCzyMozeOpublikowac',
						'bCzyMozeZdjac',
						'bCzyMozeArchiwizowac',
						'bCzyMozePrzywrocic',
						'bCzyMozeDrukowac',
						'bGid',
					])) {
						$items[$item['bGid']] = $item;
					}
				}
			}
		} elseif (isset($resp['bFormularzeOceny']['bFormularzOceny'])) {
			$items[$resp['bFormularzeOceny']['bFormularzOceny']['bGid']] = $resp['bFormularzeOceny']['bFormularzOceny'];
		} else {
			$items = array();
		}

		if (isset($resp['bCzyMozeDodawac']) && $resp['bCzyMozeDodawac'] == 'true') {
			$this->Session->write('FormularzeOceny_CzyMozeDodawac', true);
			$this->set(['CzyMozeDodawac' => true]);
			$czyMoznaDodawa = true;
		} else {
			$this->Session->delete('FormularzeOceny_CzyMozeDodawac');
			$this->set(['CzyMozeDodawac' => false]);
			$czyMoznaDodawa = false;
		}

		if (isset($resp['bCzyMozeDodawacSzablony']) && $resp['bCzyMozeDodawacSzablony'] == 'true') {
			$this->Session->write('FormularzeOceny_CzyMozeDodawacSzablony', true);
			$this->set(['CzyMozeDodawacSzablony' => true]);
		} else {
			$this->Session->delete('FormularzeOceny_CzyMozeDodawacSzablony');
			$this->set(['CzyMozeDodawacSzablony' => false]);
		}

		if (isset($resp['bCzyUMC'])) {
			$this->set('czyUMC', $resp['bCzyUMC']);
			$this->Session->write('FormularzeOcenyItemczyUMC_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''), $resp['bCzyUMC']);
		}

		$rjson = $this->_handle_response_json($resp);

		if (isset($rjson['login']) && !empty($rjson['login'])) {
			echo 'login';
			die();
		}

		$this->Session->write('FormularzeOcenyItems_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''), $items);
		$this->Session->write('FormularzeOcenyItemsCzyMozeDodawac_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''), $czyMoznaDodawa);

		return $items;

	}

	public function daj_nowy_formularz_oceny()
	{
		$this->view = 'formularz_oceny';
		$item = [];

		if ($this->request->is('post')) {
			$type = $this->request->data('run');
			$tab = $this->request->data('tab');
			$archive = $this->request->data('archive');
			$formularz = $this->request->data('formularz');

			if (!empty($formularz)) {
				foreach ($formularz as $item) {
					switch ($item['name']) {
						case 'Pracownik':
							$address['pracownik'] = $item['value'];
							break;

						case 'Nrewid':
							if (empty($address['pracownik'])) {
								$address['pracownik'] = $item['value'];
							}
							break;

						case 'Rodzaj':
							$address['rodzaj'] = $item['value'];
							break;
					}
				}
			}

		} else {
			$type = $this->request->query('run');
			$tab = $this->request->query('tab');
			$archive = $this->request->query('archive');
			$address = [];
		}

		if ($type == 'add-pracownikow') {

			$address = $this->wybor_pracownikow();
			$type = 'add-pracownikow-save';

		} elseif ($type == 'add-robocze') {

			$address = $this->wybor_pracownikow('robocze');
			$type = 'add-robocze-save';

		} else {

			$option = [
				'Nrewid' => $address['pracownik'] ?: null,
				'RodzajFormularza' => $address['rodzaj'] ?: null
			];

			$resp = $this->Api->DajNowyFormularzOceny($this->_getGid(), $option);

			$rjson = $this->_handle_response_json($resp);

			if (isset($rjson['login']) && !empty($rjson['login'])) {
				echo 'login';
				die();
			}

			$rjson = $this->_handle_response_json2($resp);

			if (isset($rjson['error'])) {
				echo json_encode($rjson);
				die();
			}

			if (isset($item)) {
				$item = $resp['bFormularz'];
				$this->prepareData($item);
				if (!empty($item['bElementy']['bElementOceny'])) {
					foreach ($item['bElementy']['bElementOceny'] as $key => $elem) {
						$this->parserElementOceny($item['bElementy']['bElementOceny'], $key, $elem);
					}
				}
			}
		}

		$this->set(compact('item', 'type', 'tab', 'address', 'archive'));
	}

	public function prepareData($item)
	{
		if (!empty($item)) {
			$this->request->data = ['FormularzOceny' => [
				'bNazwa' => $item['bNazwa'],
				'Ni' => $item['Ni'],
				'StanowiskoKodOpis' => $item['StanowiskoKodOpis'],
				'KomorkaKodOpis' => $item['KomorkaKodOpis'],
				'bAdresPrzelozonego0' => ($item['bAdresPrzelozonego0']['cNazwaWyswietlana'] ?: '') . '' . (!empty($item['bAdresPrzelozonego0']['cStanowisko']) ? ' / ' . $item['bAdresPrzelozonego0']['cStanowisko'] : ''),
				'bAdresPrzelozonego1' => ($item['bAdresPrzelozonego1']['cNazwaWyswietlana'] ?: '') . '' . (!empty($item['bAdresPrzelozonego1']['cStanowisko']) ? ' / ' . $item['bAdresPrzelozonego1']['cStanowisko'] : ''),
				'bAdresPrzelozonego2' => ($item['bAdresPrzelozonego2']['cNazwaWyswietlana'] ?: '') . '' . (!empty($item['bAdresPrzelozonego2']['cStanowisko']) ? ' / ' . $item['bAdresPrzelozonego2']['cStanowisko'] : ''),
				'bAdresPrzelozonego3' => ($item['bAdresPrzelozonego3']['cNazwaWyswietlana'] ?: '') . '' . (!empty($item['bAdresPrzelozonego3']['cStanowisko']) ? ' / ' . $item['bAdresPrzelozonego3']['cStanowisko'] : ''),
				'bAdresPrzelozonego4' => ($item['bAdresPrzelozonego4']['cNazwaWyswietlana'] ?: '') . '' . (!empty($item['bAdresPrzelozonego4']['cStanowisko']) ? ' / ' . $item['bAdresPrzelozonego4']['cStanowisko'] : ''),
				'bOkresOcenyOd' => date("Y-m-d", strtotime($item['bOkresOcenyOd'])),
				'bOkresOcenyDo' => date("Y-m-d", strtotime($item['bOkresOcenyDo'])),
				'bDataOceny' => date("Y-m-d", (empty($item['bDataOceny']) ? time() : strtotime($item['bDataOceny']))),
				'bDataZapoznaniaSie' => !empty($item['bDataZapoznaniaSie']) ? date("Y-m-d", strtotime($item['bDataZapoznaniaSie'])) : null,
				'bOdwolanie' => $item['bOdwolanie'],
				'bCzyStatusOdwolania' => $item['bCzyStatusOdwolania'],
				'bStatusOdwolania' => $item['bStatusOdwolania'],
				'bCzyDecyzjaOdwolania' => $item['bCzyDecyzjaOdwolania'],
				'bDecyzjaOdwolania' => $item['bDecyzjaOdwolania'],
				'bOcena' => $item['bOcena'],
				'bPowod' => $item['bPowod'],
				'bInfo' => str_replace("\n", "<br>", $item['bInfo']),
				'bDataWystawieniaOceny' => !empty($item['bDataWystawieniaOceny']) ? date("Y-m-d", strtotime($item['bDataWystawieniaOceny'])) : null,
				'bCzyOdwolanie' => $item['bCzyOdwolanie'],
				'DodatkowyOpisKodOpis' => $item['DodatkowyOpisKodOpis'],
				'bDataOdwolania' => !empty($item['bDataOdwolania']) ? date("Y-m-d", strtotime($item['bDataOdwolania'])) : null,
			]];
		}
	}

	public function daj_formularz_oceny($gid)
	{
		$this->view = 'formularz_oceny';

		$options = ['gid' => $gid];

		$resp = $this->Api->DajFormularzOceny($this->_getGid(), $options);
		$rjson = $this->_handle_response_json($resp);

		if (isset($rjson['login']) && !empty($rjson['login'])) {
			echo 'login';
			die();
		}

		$item = isset($resp['bFormularzOceny']) ? $resp['bFormularzOceny'] : [];
		$this->prepareData($item);
		if (!empty($item['bElementy']['bElementOceny'])) {
			foreach ($item['bElementy']['bElementOceny'] as $key => $elem) {
				$this->parserElementOceny($item['bElementy']['bElementOceny'], $key, $elem);
			}
		}

		$type = $this->request->query('run');
		$tab = $this->request->query('tab');
		$archive = $this->request->query('archive');
		$this->set(compact('item', 'type', 'tab', 'archive'));
	}

	public function zapisz_formularz_oceny($type, $public = null)
	{
		$formularz = [];
		$elements = [];
		$context = null;

		if ($this->request->is('post')) {
			$tab = $_POST['tab'];
			$archive = ($_POST['archive'] == 1) ? 'true' : 'false';

			$data = $this->request->data('formularz');

			if (!empty($data)) {
				foreach ($data as $val) {
					$name = $this->nomalizeName($val['name']);
					preg_match_all('/\[(.*?)\]/', $name, $matches);

					if (!empty($matches[1][0]) && $matches[1][0] == 'ContextElemnts') {
						$context = $val['value'];
					} elseif (!empty($matches[1][0]) && $matches[1][0] == 'FormularzOceny' && count($matches[1]) >= 3) {
						$elements[$matches[1][1]][$matches[1][2]] = $val['value'];
					} elseif (!empty($matches[1][0]) && $matches[1][0] == 'FormularzOceny' && isset($matches[1][1])) {
						$formularz[$matches[1][1]] = $val['value'];
					}
				}
			}
		}
		if (!empty($formularz) && $context !== null) {

			$obj = json_decode(base64_decode($context), true);
			//base format

			if ($pos = strpos($obj['data']['bDataUtworzenia'], ".")) {
				$obj['data']['bDataUtworzenia'] = substr($obj['data']['bDataUtworzenia'], 0, $pos);
			}
			if (isset($obj['data']['bCzyOdwolanie'])) {
				$obj['data']['bCzyOdwolanie'] = 'false';
			}

			$options = $this->mergeData($obj['data'], $formularz,
				['bOkresOcenyDo', 'bOkresOcenyOd', 'bDataOceny', 'bOdwolanie', 'bStatusOdwolania', 'bDecyzjaOdwolania', 'bNazwa', 'bOcena', 'bPowod', 'bDataWystawieniaOceny', 'bCzyOdwolanie', 'bDataOdwolania'],
				['bOkresOcenyDo' => 'AddTime', 'bOkresOcenyOd' => 'AddTime', 'bDataOceny' => 'AddTime', 'bDataUtworzenia' => 'CutMicroTime', 'bDataOdwolania' => 'AddTime']);
			$options['bElementy'] = $this->mergeElements($obj['elements'], $elements, ['Text', 'ElementZwyczajny']);
			if ($type == 'add') {
				if ($public == 'public') {
					$options['bCzyTest'] = 'true';
					$test = $this->Api->DodajPublikujFormularzOceny($this->_getGid(), $this->clearEmptyArray($options));
					$test_json = $this->_handle_response_json($test);
					if (isset($test_json['error'])) {
						$response_json = json_encode($test_json);
					} else {
						$options['bCzyTest'] = 'false';
						$response = $this->Api->DodajPublikujFormularzOceny($this->_getGid(), $this->clearEmptyArray($options));
						$response_json = json_encode($this->_handle_response_json($response));
					}
				} else {
					$options['bCzyTest'] = 'true';
					$test = $this->Api->DodajFormularzOceny($this->_getGid(), $this->clearEmptyArray($options));
					$test_json = $this->_handle_response_json($test);
					if (isset($test_json['error'])) {
						$response_json = json_encode($test_json);
					} else {
						$options['bCzyTest'] = 'false';
						$response = $this->Api->DodajFormularzOceny($this->_getGid(), $this->clearEmptyArray($options));
						$response_json = json_encode($this->_handle_response_json($response));
					}
				}
				$itemGid = $options['bGid'];
				$this->Session->write('formularz_oceny_move', $itemGid);
				$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_' . strtolower($archive ?? ''));
				if (!empty($items)) {
					$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $itemGid]);
					$items[$itemGid] = $item['bFormularzOceny'];
					$this->Session->write('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_' . strtolower($archive ?? ''), $items);
				}
				echo $response_json;
				die();
			} elseif ($type == 'edit') {
				$options['bCzyTest'] = 'true';
				$test = $this->Api->EdytujFormularzOceny($this->_getGid(), $this->clearEmptyArray($options));
				$test_json = $this->_handle_response_json($test);
				if (isset($test_json['error'])) {
					$response_json = json_encode($test_json);
				} else {
					$options['bCzyTest'] = 'false';
					$response = $this->Api->EdytujFormularzOceny($this->_getGid(), $this->clearEmptyArray($options));
					$response_json = json_encode($this->_handle_response_json($response));
				}
				$itemGid = $options['bGid'];
				$this->Session->write('formularz_oceny_move', $itemGid);
				$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $itemGid]);
				$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_true');
				if (!empty($items)) {
					if (isset($items[$itemGid])) {
						$items[$itemGid] = $item['bFormularzOceny'];
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_true', $items);
					}
				}
				$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_false');
				if (!empty($items)) {
					if (isset($items[$itemGid])) {
						$items[$itemGid] = $item['bFormularzOceny'];
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_false', $items);
					}
				}
				echo $response_json;
				die();
			}
		}
	}

	private function parserElementOceny(&$master, $key, $elem)
	{
		if (isset($elem['bElementy']['bElementOceny']['bNazwa'])) {
			$master[$key]['bElementy']['bElementOceny'] = $elem['bElementy']['bElementOceny'] = [$elem['bElementy']['bElementOceny']];
		}

		if (isset($elem['bElementy']['bElementOceny'][0])) {
			foreach ($elem['bElementy']['bElementOceny'] as $i => $item) {
				$this->parserElementOceny($master[$key]['bElementy']['bElementOceny'], $i, $item);
			}
		}
	}

	private function clearEmptyArray($options = [])
	{

		foreach ($options as $key => $val) {
			if (is_array($val) && empty($val)) {
				$options[$key] = '';
			} elseif (is_array($val)) {
				$options[$key] = $this->clearEmptyArray($val);
			}
		}

		return $options;
	}

	private function wartoscElement(&$master, $key, $val, $elements)
	{
		if (isset($elements[$val['bNazwa']]['SWartosc'])) {
			$master[$key]['bSWartosc'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['SWartosc']);
		}
		if (isset($elements[$val['bNazwa']]['Data'])) {
			$master[$key]['bData'] = $elements[$val['bNazwa']]['Data'];
		}
		if (isset($elements[$val['bNazwa']]['SWartosc1'])) {
			$master[$key]['bSWartosc1'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['SWartosc1']);
		}
		if (isset($elements[$val['bNazwa']]['SWartosc2'])) {
			$master[$key]['bSWartosc2'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['SWartosc2']);
		}
		if (isset($elements[$val['bNazwa']]['SWartosc3'])) {
			$master[$key]['bSWartosc3'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['SWartosc3']);
		}
		if (isset($elements[$val['bNazwa']]['IWartosc'])) {
			$master[$key]['bIWartosc'] = $elements[$val['bNazwa']]['IWartosc'];
		}
		if (isset($elements[$val['bNazwa']]['DWartosc'])) {
			$master[$key]['bDWartosc'] = $elements[$val['bNazwa']]['DWartosc'];
		}
		if (isset($elements[$val['bNazwa']]['BWartosc'])) {
			$master[$key]['bBWartosc'] = in_array($elements[$val['bNazwa']]['BWartosc'], ['true', '1', 'on', 't']) ? 'true' : 'false';
		}
		if (isset($elements[$val['bNazwa']]['Etykieta'])) {
			$master[$key]['bEtykieta'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['Etykieta']);
		}
		if (isset($elements[$val['bNazwa']]['Opis'])) {
			$master[$key]['bOpis'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['Opis']);
		}
		if (isset($elements[$val['bNazwa']]['Udostepnienie']) && !empty($elements[$val['bNazwa']]['Udostepnienie'])) {
			$master[$key]['bUdostepnienie'] = explode("|", $elements[$val['bNazwa']]['Udostepnienie']);
		}
	}

	private function mergeElements($master, $elements, $delete = [])
	{
		foreach ($master as $key => $val) {

			if (!empty($val['bElementy']['bElementOceny'])) {
				$master[$key]['bElementy']['bElementOceny'] = $this->mergeElements($master[$key]['bElementy']['bElementOceny'], $elements, $delete);
			}

			if (key_exists($val['bNazwa'], $elements)) {
				$this->wartoscElement($master, $key, $val, $elements);
			} elseif (!empty($master[$key]['bMozliweNoweElementy'])) {
				if (isset($master[$key]['bMozliweNoweElementy']['bElementOceny'][0])) {
					$mozliweNoweElementy = $master[$key]['bMozliweNoweElementy']['bElementOceny'];
				} else {
					$mozliweNoweElementy = [$master[$key]['bMozliweNoweElementy']['bElementOceny']];
				}
				foreach ($mozliweNoweElementy as $i => $elem) {

					$finds = array_filter($elements, function ($k) use ($elem) {
						return strpos($k, $elem['bNazwa']) !== false;
					}, 2);

					if (!empty($finds)) {
						foreach ($finds as $name => $find) {
							$find['bNazwa'] = $name;
							$this->wartoscElement($mozliweNoweElementy, $i, $find, $elements);
							$actual = $mozliweNoweElementy[$i];
							$actual['bNazwa'] = $find['bNazwa'];
							$actual['bGid'] = $this->GUID();
							if (is_array($master[$key]['bElementy']['bElementOceny'])) {
								$exists = false;
								array_walk($master[$key]['bElementy']['bElementOceny'], function ($item) use (&$exists, $actual) {
									if ($item['bNazwa'] == $actual['bNazwa']) {
										$exists = true;
									}
								});
								if (!$exists) {
									array_unshift($master[$key]['bElementy']['bElementOceny'], $actual);
								}
							} elseif (isset($master[$key]['bElementy'])) {
								$master[$key]['bElementy']['bElementOceny'] = [$actual];
							}
						}
					}
				}
			} elseif (!empty($delete) && in_array($master[$key]['bRodzaj'], $delete)) {
				unset($master[$key]);
			}
		}

		return $master;
	}

	public function usun_formularz_oceny($gid)
	{
		$options = [
			'gid' => $gid
		];

		$response = $this->Api->UsunFormularzOceny($this->_getGid(), $options);

		echo json_encode($this->_handle_response_json($response));
		die();
	}

	private function wybor_pracownikow($type = null)
	{
		$address = null;
		$pracownik = null;
		$rodzaj = null;

		$this->view = 'modal_oceny';

		$resp2 = $this->Api->DajAdresyPodleglychOceny($this->_getGid());

		if (isset($resp2['bAdresy']['bAdres'])) {
			if (isset($resp2['bAdresy']['bAdres'][0])) {
				$address = $resp2['bAdresy']['bAdres'];
			} else {
				$address = [$resp2['bAdresy']['bAdres']];
			}
		}

		if ($type == 'robocze') {
			$rodzaj['FormularzOceny'] = 'Formularz oceny dla określonego pracownika';
			if ($this->Session->read('FormularzeOceny_CzyMozeDodawacSzablony') === true) {
				$rodzaj['WzorFormularzaOceny'] = 'Szablon formularza dla pojedynczego lub wielu pracowników';
			}
			$pracownik = $this->Auth->user('cNumerEwidencyjny');
		}

		return ['address' => $address, 'pracownik' => $pracownik, 'rodzaj' => $rodzaj];
	}

	public function operacje_formularz_oceny($gid, $operacja)
	{
		$type = $this->request->query('run');
		$tab = $this->request->query('tab');
		$address = null;


		switch ($operacja) {
			case 1:

				$options = [
					'gid' => $gid,
					'NumeryEwidencyjne' => [],
					'RodzajOperacji' => 'Archiwizacja'
				];

				$resp = $this->Api->WykonajOperacjeNaFormularzu($this->_getGid(), $options);
				$json = json_encode($this->_handle_response_json($resp));
				echo $json;
				if ($json === '{"message":"Pomy\u015blnie zarchiwizowano formularz. "}') {
					if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
						$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
						unset($items[$gid]);
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
					}
				}

				die();

				break;

			case 2:

				$options = [
					'gid' => $gid,
					'NumeryEwidencyjne' => [],
					'RodzajOperacji' => 'PrzywrocenieZArchiwum'
				];

				$resp = $this->Api->WykonajOperacjeNaFormularzu($this->_getGid(), $options);
				$json = json_encode($this->_handle_response_json($resp));
				echo $json;

				if ($json === '{"message":"Pomy\u015blnie przywr\u00f3cono formularz z archiwum. "}') {
					if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
						$itemsArchive = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
						if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
							$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
							$items[$gid] = $itemsArchive[$gid];
							$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
						}
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
					}
				}

				die();

				break;

			case 3:

				if ($this->request->is('post')) {

					$nrewid = [];
					$data = $this->request->data('formularz');
					if (!empty($data)) {
						foreach ($data as $val) {
							array_push($nrewid, $val['value']);
						}
					}
					$options = [
						'gid' => $gid,
						'NumeryEwidencyjne' => $nrewid,
						'RodzajOperacji' => 'Opublikuj'
					];

					$resp = $this->Api->WykonajOperacjeNaFormularzu($this->_getGid(), $options);
					$json = json_encode($this->_handle_response_json($resp));
					echo $json;

					if ($json === '{"message":"Pomy\u015blnie opublikowano formularz. "}' and 'robocze' === $tab) {
						$tab2 = 'moje';
						if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
							$itemsArchive = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
							if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true'))) {
								$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true');
								$items[$gid] = $itemsArchive[$gid];
								$this->Session->write('FormularzeOcenyItems_' . strtolower($tab2) . '_true', $items);
							}
							unset($itemsArchive[$gid]);
							$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
						}
						if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
							$itemsArchive = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
							if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false'))) {
								$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false');
								$items[$gid] = $itemsArchive[$gid];
								$this->Session->write('FormularzeOcenyItems_' . strtolower($tab2) . '_false', $items);
							}
							unset($itemsArchive[$gid]);
							$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $itemsArchive);
						}
					}

					die();

				} else {

					$resp = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);

					if (!empty($resp['bFormularzOceny']['bRodzaj'])) {

						if ($resp['bFormularzOceny']['bRodzaj'] == 'WzorFormularzaOceny') {

							$address = $this->wybor_pracownikow();
							$type = 'public-save';

						} else {

							$options = [
								'gid' => $gid,
								'NumeryEwidencyjne' => [],
								'RodzajOperacji' => 'Opublikuj'
							];

							$resp = $this->Api->WykonajOperacjeNaFormularzu($this->_getGid(), $options);

							$json = json_encode($this->_handle_response_json($resp));
							echo $json;

							if ($json === '{"message":"Pomy\u015blnie opublikowano formularz. "}' and 'robocze' === $tab) {
								$tab2 = 'moje';
								if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
									$itemsArchive = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
									if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true'))) {
										$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true');
										$items[$gid] = $itemsArchive[$gid];
										$this->Session->write('FormularzeOcenyItems_' . strtolower($tab2) . '_true', $items);
									}
									unset($itemsArchive[$gid]);
									$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
								}
								if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
									$itemsArchive = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
									if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false'))) {
										$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false');
										$items[$gid] = $itemsArchive[$gid];
										$this->Session->write('FormularzeOcenyItems_' . strtolower($tab2) . '_false', $items);
									}
									unset($itemsArchive[$gid]);
									$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $itemsArchive);
								}
							}
							die();
						}

					}

				}

				break;

			case 4:

				$options = [
					'gid' => $gid,
					'NumeryEwidencyjne' => [],
					'RodzajOperacji' => 'Zdejmij'
				];

				$resp = $this->Api->WykonajOperacjeNaFormularzu($this->_getGid(), $options);
				$json = json_encode($this->_handle_response_json($resp));
				echo $json;

				if ($json === '{"message":"Pomy\u015blnie zdj\u0119to formularz z publikacji. "}' and 'moje' === $tab) {
					$tab2 = 'robocze';
					if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
						$itemsArchive = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
						if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true'))) {
							$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true');
							$items[$gid] = $itemsArchive[$gid];
							$this->Session->write('FormularzeOcenyItems_' . strtolower($tab2) . '_true', $items);
						}
						unset($itemsArchive[$gid]);
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
					}
					if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
						$itemsArchive = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
						if (!empty($this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false'))) {
							$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false');
							$items[$gid] = $itemsArchive[$gid];
							$this->Session->write('FormularzeOcenyItems_' . strtolower($tab2) . '_false', $items);
						}
						unset($itemsArchive[$gid]);
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $itemsArchive);
					}
				}

				die();

				break;

			case 5:

				$options = [
					'gid' => $gid,
					'NumeryEwidencyjne' => [],
					'RodzajOperacji' => 'Akceptacja'
				];

				$resp = $this->Api->WykonajOperacjeNaFormularzu($this->_getGid(), $options);

				$this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
				if(isset($items[$gid])) {
					$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
					$items[$gid] = $item['bFormularzOceny'];
					$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $items);
				}
				$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
				if(isset($items[$gid])) {
					$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
					$items[$gid] = $item['bFormularzOceny'];
					$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
				}

				echo json_encode($this->_handle_response_json($resp));
				die();

				break;

			case 6:

				$options = [
					'gid' => $gid,
					'NumeryEwidencyjne' => [],
					'RodzajOperacji' => 'ZdejmijAkceptacje'
				];

				$resp = $this->Api->WykonajOperacjeNaFormularzu($this->_getGid(), $options);

				$this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
				if(isset($items[$gid])) {
					$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
					$items[$gid] = $item['bFormularzOceny'];
					$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $items);
				}
				$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
				if(isset($items[$gid])) {
					$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
					$items[$gid] = $item['bFormularzOceny'];
					$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
				}

				echo json_encode($this->_handle_response_json($resp));
				die();

				break;

			case 7:

				$options = [
					'gid' => $gid,
				];

				$resp = $this->Api->AktualizujPrzelozonychFormularzaOceny($this->_getGid(), $options);

				$this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
				if(isset($items[$gid])) {
					$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
					$items[$gid] = $item['bFormularzOceny'];
					$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $items);
				}
				$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
				if(isset($items[$gid])) {
					$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
					$items[$gid] = $item['bFormularzOceny'];
					$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
				}

				echo json_encode($this->_handle_response_json($resp));
				die();

				break;

			case 8:

				if ($this->request->is('post')) {

					$formularz = $this->request->data('formularz');

					$options = [
						'gid' => $gid,
						'gid_tworca' => isset($formularz[0]['value']) ? $formularz[0]['value'] : null
					];

					$resp = $this->Api->AktualizujTworceFormularzaOceny($this->_getGid(), $options);

					$this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
					if(isset($items[$gid])) {
						$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
						$items[$gid] = $item['bFormularzOceny'];
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $items);
					}
					$items = $this->Session->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
					if(isset($items[$gid])) {
						$item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
						$items[$gid] = $item['bFormularzOceny'];
						$this->Session->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
					}

					echo json_encode($this->_handle_response_json($resp));
					die();

				} else {

					$type = 'add-tworca-save';
					$address = $this->daj_pracownikow_oceny();
				}

				break;

			case 9:

				$options = [
					'gid' => $gid,
					'RodzajRaportu' => 'FORMULARZ_OCENY'
				];

				$this->drukuj_raport(base64_encode(serialize($options)));

				break;

			case 10:

				$options = [
					'gid' => $gid,
				];

				$resp = $this->Api->WstawZapoznanieSieZFormularzemUMC($this->_getGid(), $options);

				echo json_encode($this->_handle_response_json($resp));
				die();

				break;
		}

//		$this->set(compact('item', 'type', 'tab', 'address', 'gid'));
		$this->set(compact('type', 'tab', 'address', 'gid'));
	}

	public function drukuj_raport($options)
	{
		if ($options == 'MOJ_CZAS_PRACY') {
			$opt = $this->Session->read('calendar_feed_ajax');
			$options = [
				'Miesiac' => isset($opt['dat:OkresOd']) ? $opt['dat:OkresOd'] : '',
				'RodzajRaportu' => 'MOJ_CZAS_PRACY'
			];
		} elseif ($options == 'CZAS_PRACY_PODLEGLYCH') {
			$opt = $this->Session->read('calendar_feed_ajax_employee');
			$options = [
				'Miesiac' => isset($opt['dat:OkresOd']) ? $opt['dat:OkresOd'] : '',
				'NumeryEwidencyjne' => isset($opt['dat:NumeryEwidencyjne']) ? $opt['dat:NumeryEwidencyjne'] : [],
				'RodzajRaportu' => 'CZAS_PRACY_PODLEGLYCH'
			];
		} else if ($options == 'CZAS_PRACY_PODLEGLYCH_DLA_KIEROWNIKA') {
			$opt = $this->Session->read('calendar_feed_ajax');
			$options = array(
				'Miesiac' => isset($opt['dat:OkresOd']) ? $opt['dat:OkresOd'] : '',
				'NumeryEwidencyjne' => isset($opt['dat:NumeryEwidencyjne']) ? $opt['dat:NumeryEwidencyjne'] : [],
				'RodzajRaportu' => 'MOJ_CZAS_PRACY_DLA_KIEROWNIKA'
			);
		} else {
			$options = unserialize(base64_decode($options));
		}

		$resp = $this->Api->DrukujRaport($this->_getGid(), $options);

		if (!empty($resp['bPDF'])) {
			header("Content-type:application/pdf");
			$pdf = base64_decode($resp['bPDF']);
			echo $pdf;
		} else {
			echo '<h1>problem z wygenerowaniem pdf</h1>';
		}
		die();
	}

	private function GUID()
	{
		if (function_exists('com_create_guid') === true) {
			return trim(com_create_guid(), '{}');
		}

		return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
	}


	/**
	 * @param string $name
	 * @return string
	 */
	private function nomalizeName($name)
	{
		if (!strpos($name, 'data[FormularzOceny]')) {
			return str_replace('FormularzOceny[', 'data[FormularzOceny][', $name);
		}

		return $name;
	}
}
