<?php

namespace App\Controller;

use Cake\Core\App;

App::className('ApiController', 'Controller');
App::className('Api', 'Service');

include_once 'AjaxTrait.php';

class OcenyController extends ApiController
{

    use AjaxTrait;

    public function dajPracownikowOceny()
    {
        $this->viewBuilder()->setTemplate('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'] = array();
        }

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

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

        return $address;
    }

    public function dajFormularzeOceny($tab = null, $archive = null)
    {
        $this->viewBuilder()->setTemplate('tabs');

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

        if ($archive === null) {
            $archive = $this->request->getQuery('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 listaMoje()
    {
        $this->viewBuilder()->setTemplate('table');

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

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

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

    public function listaPracownikow()
    {
        $this->viewBuilder()->setTemplate('table');

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

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

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

    public function listaUdostepnione()
    {
        $this->viewBuilder()->setTemplate('table');

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

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

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

    public function listaRobocze()
    {
        $this->viewBuilder()->setTemplate('table');

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

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

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

    public function listaAdministracja()
    {
        $this->viewBuilder()->setTemplate('table');

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

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

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

    public function listaAdministracjaRobocze()
    {
        $this->viewBuilder()->setTemplate('table');

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

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

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

    private function lista($options = array())
    {
        if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? '')))) {
            if (!empty($this->request->getSession()->read('FormularzeOcenyItemczyUMC_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? '')))) {
                $this->set('czyUMC', $this->request->getSession()->read('FormularzeOcenyItemczyUMC_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? '')));
            }
            $this->set(['CzyMozeDodawac' => $this->request->getSession()->read('FormularzeOcenyItemsCzyMozeDodawac_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''))]);
            return $this->request->getSession()->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',
                        '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->request->getSession()->write('FormularzeOceny_CzyMozeDodawac', true);
            $this->set(['CzyMozeDodawac' => true]);
            $czyMoznaDodawa = true;
        } else {
            $this->request->getSession()->delete('FormularzeOceny_CzyMozeDodawac');
            $this->set(['CzyMozeDodawac' => false]);
            $czyMoznaDodawa = false;
        }

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

        if (isset($resp['bCzyUMC'])) {
            $this->set('czyUMC', $resp['bCzyUMC']);
            $this->request->getSession()->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->request->getSession()->write('FormularzeOcenyItems_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''), $items);
        $this->request->getSession()->write('FormularzeOcenyItemsCzyMozeDodawac_' . strtolower($options['tab'] ?? '') . '_' . strtolower($options['archive'] ?? ''), $czyMoznaDodawa);

        return $items;

    }

    public function dajNowyFormularzOceny()
    {
        $this->viewBuilder()->setTemplate('formularz_oceny');
        $item = [];

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

            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->getQuery('run');
            $tab = $this->request->getQuery('tab');
            $archive = $this->request->getQuery('archive');
            $address = [];
        }

        if ($type == 'add-pracownikow') {
            $address = $this->wyborPracownikow();
            $type = 'add-pracownikow-save';

        } else if ($type == 'add-robocze') {
            $address = $this->wyborPracownikow('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 = $this->request->withData('FormularzOceny', array(
                '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 dajFormularzOceny($gid)
    {
        $this->viewBuilder()->setTemplate('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->getQuery('run');
        $tab = $this->request->getQuery('tab');
        $archive = $this->request->getQuery('archive');
        $address = [];
        if ($type == 'add-pracownikow') {
            $address = $this->wyborPracownikow();

        } else if ($type == 'add-robocze') {
            $address = $this->wyborPracownikow('robocze');
        }

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

    public function zapiszFormularzOceny($type, $public = null): void
    {
        $this->viewBuilder()->setLayout('ajax');
        $formularz = [];
        $elements = [];
        $context = null;

        if ($this->request->is('post')) {
            $tab = $_POST['tab'];
            $archive = ($this->getRequest()->getData()['formularz_archive'] == 1) ? 'true' : 'false';
            $this->viewBuilder()->setTemplate('tabs');
            $getData = $this->getRequest()->getData()['formularz'];

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

                    if ($name == '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((string)$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', 'bCzyStatusOdwolania', 'bCzyDecyzjaOdwolania', '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->request->getSession()->write('formularz_oceny_move', $itemGid);
                $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_' . strtolower($archive ?? ''));
                if (!empty($items)) {
                    $item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $itemGid]);
                    $items[$itemGid] = $item['bFormularzOceny'];
                    $this->request->getSession()->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->request->getSession()->write('formularz_oceny_move', $itemGid);
                $item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $itemGid]);
                $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_true');
                if (!empty($items)) {
                    if (isset($items[$itemGid])) {
                        $items[$itemGid] = $item['bFormularzOceny'];
                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_true', $items);
                    }
                }
                $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_false');
                if (!empty($items)) {
                    if (isset($items[$itemGid])) {
                        $items[$itemGid] = $item['bFormularzOceny'];
                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab ?? '') . '_false', $items);
                    }
                }
                echo $response_json;
                die();
            }
        }
    }

    private function parserElementOceny(&$master, $key, $elem): void
    {
        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 = array())
    {

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

        return $options;
    }

    private function wartoscElement(&$master, $key, $val, $elements): void
    {
        if (isset($elements[$val['bNazwa']]['SWartosc'])) {
            $master[$key]['bSWartosc'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['SWartosc']);
        }
        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']]['Data'])) {
            $master[$key]['bData'] = str_replace("<br>", "\n", $elements[$val['bNazwa']]['Data']);
        }
        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 = array())
    {
        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);
            } else if (!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];
                            }
                        }
                    }
                }
            } else if (!empty($delete) && in_array($master[$key]['bRodzaj'], $delete)) {
                unset($master[$key]);
            }
        }

        return $master;
    }

    public function usunFormularzOceny($gid)
    {
        $options = array(
            'gid' => $gid
        );

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

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

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

        $this->viewBuilder()->setTemplate('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->request->getSession()->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 operacjeFormularzOceny($gid, $operacja): void
    {
        $type = $this->request->getQuery('run');
        $tab = $this->request->getQuery('tab');
        $address = null;


        switch ($operacja) {
            case 1:

                $options = array(
                    '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->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
                        $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
                        unset($items[$gid]);
                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
                    }
                }

                die();

                break;

            case 2:

                $options = array(
                    '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->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
                        $itemsArchive = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
                        if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
                            $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
                            $items[$gid] = $itemsArchive[$gid];
                            $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $items);
                        }
                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
                    }
                }

                die();

                break;

            case 3:

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

                    $nrewid = [];
                    $getData = $this->request->getData('formularz');
                    if (!empty($getData)) {
                        foreach ($getData as $val) {
                            array_push($nrewid, $val['value']);
                        }
                    }
                    $options = array(
                        '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->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
                            $itemsArchive = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
                            if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true'))) {
                                $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true');
                                $items[$gid] = $itemsArchive[$gid];
                                $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab2) . '_true', $items);
                            }
                            unset($itemsArchive[$gid]);
                            $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
                        }
                        if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
                            $itemsArchive = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
                            if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false'))) {
                                $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false');
                                $items[$gid] = $itemsArchive[$gid];
                                $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab2) . '_false', $items);
                            }
                            unset($itemsArchive[$gid]);
                            $this->request->getSession()->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->wyborPracownikow();
                            $type = 'public-save';

                        } else {

                            $options = array(
                                '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->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
                                    $itemsArchive = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
                                    if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true'))) {
                                        $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true');
                                        $items[$gid] = $itemsArchive[$gid];
                                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab2) . '_true', $items);
                                    }
                                    unset($itemsArchive[$gid]);
                                    $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
                                }
                                if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
                                    $itemsArchive = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
                                    if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false'))) {
                                        $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false');
                                        $items[$gid] = $itemsArchive[$gid];
                                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab2) . '_false', $items);
                                    }
                                    unset($itemsArchive[$gid]);
                                    $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $itemsArchive);
                                }
                            }

                            die();
                        }

                    }

                }

                break;

            case 4:

                $options = array(
                    '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->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true'))) {
                        $itemsArchive = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
                        if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true'))) {
                            $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_true');
                            $items[$gid] = $itemsArchive[$gid];
                            $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab2) . '_true', $items);
                        }
                        unset($itemsArchive[$gid]);
                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $itemsArchive);
                    }
                    if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false'))) {
                        $itemsArchive = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
                        if (!empty($this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false'))) {
                            $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab2) . '_false');
                            $items[$gid] = $itemsArchive[$gid];
                            $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab2) . '_false', $items);
                        }
                        unset($itemsArchive[$gid]);
                        $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_false', $itemsArchive);
                    }
                }

                die();

                break;

            case 5:

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

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

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

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

                break;

            case 6:

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

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

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

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

                break;

            case 7:

                $options = array(
                    'gid' => $gid,
                );

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


                $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_true');
                if(isset($items[$gid])) {
                    $item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
                    $items[$gid] = $item['bFormularzOceny'];
                    $this->request->getSession()->write('FormularzeOcenyItems_' . strtolower($tab) . '_true', $items);
                }
                $items = $this->request->getSession()->read('FormularzeOcenyItems_' . strtolower($tab) . '_false');
                if(isset($items[$gid])) {
                    $item = $this->Api->DajFormularzOceny($this->_getGid(), ['gid' => $gid]);
                    $items[$gid] = $item['bFormularzOceny'];
                    $this->request->getSession()->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->getData('formularz');

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

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

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

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

                } else {

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

                break;

            case 9:

                $options = array(
                    'gid' => $gid,
                    'RodzajRaportu' => 'FORMULARZ_OCENY'
                );

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

                break;

            case 10:

                $options = array(
                    'gid' => $gid,
                );

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

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

                break;
        }

        //TODO:: Zweryfikować czy jak zmienna jest pusta czy działa po usunięciu zmiennej !!!
        $item = '';
        $this->set(compact('item', 'type', 'tab', 'address', 'gid'));
//        $this->set(compact('item', 'type', 'tab', 'address', 'gid'));
    }

    public function drukujRaport($options)
    {
        if ($options == 'MOJ_CZAS_PRACY') {
            $opt = $this->request->getSession()->read('calendar_feed_ajax');
            $options = array(
                'Miesiac' => isset($opt['dat:OkresOd']) ? $opt['dat:OkresOd'] : '',
                'RodzajRaportu' => 'MOJ_CZAS_PRACY'
            );
        } else if ($options == 'CZAS_PRACY_PODLEGLYCH') {
            $opt = $this->request->getSession()->read('calendar_feed_ajax_employee');
            $options = array(
                '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->request->getSession()->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;
    }


}
