<?php

namespace App\Controller;

use Cake\Core\App;

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

include_once 'AjaxTrait.php';

class NadgodzinyController extends ApiController
{
    use AjaxTrait;

    public function dajNadgodziny($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;
        }

        $allow_tabs = [
            'moje' => true,
            'pracownikow' => true,
        ];
        $_nrewid = '';
        $this->set(compact('tab', 'allow_tabs', 'archive', '_nrewid'));
    }

    public function ustawieniaNadgodzin()
    {
        $this->viewBuilder()->setTemplate('tabs');

        $tab = 'moje';

        $archive = 0;

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

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

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

        $allow_tabs = [
            'moje' => true,
            'pracownikow' => $resp['bCzySaPodlegli'] == 'false' ? false : true,
        ];

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

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

        $this->pracownicyGrafik();
    }

    public function dajNadgodzinyPracownicy($numer)
    {
        $this->dajZdarzenia($numer);

        $this->dajNadgodziny();
    }

    public function dajNadgodzine($gid)
    {
        $this->viewBuilder()->setTemplate('formularz');
        $type = $this->request->getQuery('run');
        $tab = $this->request->getQuery('tab');
        $rodzaj_edycji = 'Edycja';

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

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

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

        $context = $this->fillDataToRequest($resp);
        $_nrewid = $this->request->getQuery('nrewid') ?: -1;

        $this->set(compact('context', 'type', 'tab', 'rodzaj_edycji', 'resp', '_nrewid'));
    }

    public function dajRealizacje($gid)
    {
        $this->viewBuilder()->setTemplate('formularz');
        $type = $this->request->getData('run');
        $tab = $this->request->getData('tab');
        $rodzaj_edycji = 'Realizacja';

        $str = $this->request->getData('items');
        $realizacja = null;
        $context = '';

        if ($str) {
            $items = json_decode(base64_decode($str), true);
            foreach ($items as $item) {
                if ($gid == $item['bGid']) {
                    $realizacja = $item;
                    break;
                }
            }
        }

        if ($realizacja) {
            $options['RodzajZapisu'] = $realizacja['bRodzajZapisu'];

            if ($tab == 'moje') {
                $options['Przynaleznosc'] = 'Moje';
            } elseif ($tab == 'pracownikow') {
                $options['Przynaleznosc'] = 'MoichPracownikow';
                $options['Nrewid'] = $realizacja['bNumerPracownika'];
            }

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

            $resp['bNadgodzina'] = $this->mergeData($resp['bNadgodzina'], $realizacja,
                ['bDzien', 'bWniosekGodzinS', 'bWniosekOdS', 'bWniosekDoS', 'bCzyRealizacja'],
                ['bDzien' => 'AddTime', 'bWniosekGodzinS' => 'FormatTime']);

            $resp['bNadgodzina']['bGidWniosku'] = $realizacja['bGid'];
            $resp['bNadgodzina']['bRodzajZapisu'] = 'Realizacja';

            $context = $this->fillDataToRequest($resp);
        } else {

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

            $resp = $this->Api->DajRealizacjeDoWniosku($this->_getGid(), $options);
            $context = $this->fillDataToRequest($resp);
            if ($resp['bRodzajEdycji'] == 'Edycja') {
                $rodzaj_edycji = 'Edycja';
            }
        }

        $this->set(compact('context', 'type', 'tab', 'rodzaj_edycji', 'resp'));
    }

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

        /*
        $options['CzyTylkoWymagajaceAkceptacji'];
        $options['Nrewidy']
        $options['OkresDo']
        $options['OkresOd']
        $options['Przynaleznosc']
        */

        $options = array(
            'CzyTylkoWymagajaceAkceptacji' => 'false',
            'Przynaleznosc' => 'Moje'

        );

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

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

    public function listaPracownikow()
    {
        $this->viewBuilder()->setTemplate('table');
        /*
         * <xs:enumeration value="MoichPracownikow"><EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">2</EnumerationValue>
         * <xs:enumeration value="Moje"><EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1</EnumerationValue>
         * <xs:enumeration value="Wszystkie"/>
         */

        $options = array(
            'CzyTylkoWymagajaceAkceptacji' => 'false',
            'Przynaleznosc' => 'MoichPracownikow'

        );

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

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

    private function lista($options = array())
    {
        /*<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>*/

        $nrewid = $this->request->getQuery('nrewid');
        if ($nrewid) {
            $options['Nrewidy'] = $nrewid;
        }
        $akcept = $this->request->getQuery('archive');
        if ($akcept) {
            $options['CzyTylkoWymagajaceAkceptacji'] = 'true';
        }
        $okresOd = $this->request->getQuery('okresOd');
        if ($okresOd) {
            $options['OkresOd'] = $okresOd;
        }
        $okresDo = $this->request->getQuery('okresDo');
        if ($okresDo) {
            $options['OkresDo'] = $okresDo;
        }
        $rodzaj = $this->request->getQuery('rodzaj');
        if ($rodzaj) {
            $options['RodzajZapisu'] = $rodzaj;
        }
        $bez_realiz = $this->request->getQuery('realiz');
        if ($bez_realiz) {
            $options['CzyTylkoBezRealizacji'] = 'true';
        }

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

        if (isset($resp['bNadgodziny']['bNadgodzina'][0])) {
            $items = $resp['bNadgodziny']['bNadgodzina'];
        } elseif (isset($resp['bNadgodziny']['bNadgodzina'])) {
            $items[] = $resp['bNadgodziny']['bNadgodzina'];
        } else {
            $items = array();
        }

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

        $this->set('nrewid', $nrewid);

        $this->set('rodzaj', $rodzaj);

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

        return $items;
    }

    private function adresy($nrewid = null, &$wnioskujacy = null)
    {
        $address = [];
        $resp = $this->Api->DajAdresy($this->_getGid(), ['ZMetody' => 'NADGODZINY']);
        if (isset($resp['bAdresy']['bAdres'])) {
            if (isset($resp['bAdresy']['bAdres'][0])) {
                $address = $resp['bAdresy']['bAdres'];
            } else {
                $address = [$resp['bAdresy']['bAdres']];
            }
        }
        foreach ($address as $item) {
            if ($nrewid == $item['bNrewid']) {
                $wnioskujacy = $item;
                break;
            }
        }
        return $address;
    }

    private function dajNowaNadgodzineByAdresWnioskujacego($options, $nrewid, &$address)
    {
        $resp = $this->Api->DajNowaNadgodzine($this->_getGid(), $options);
        $address = $this->adresy($nrewid, $wnioskujacy);
        $options = $resp['bNadgodzina'];
        $options['bAdresWnioskujacego'] = [
            'cCzyMozeZaakceptowacZaPozostalych' => $wnioskujacy['bCzyMozeZaakceptowacZaPozostalych'],
            'cCzyMusiZaakceptowac' => $wnioskujacy['bCzyMusiZaakceptowac'],
            'cData' => $wnioskujacy['bData'],
            'cDataAkceptacjiOdrzucenia' => $wnioskujacy['bDataAkceptacjiOdrzucenia'],
            'cDataPowiadomienia' => $wnioskujacy['bDataPowiadomienia'],
            'cEmail' => $wnioskujacy['bEmail'],
            'cGid' => $wnioskujacy['bGid'],
            'cImie' => $wnioskujacy['bImie'],
            'cKomorka' => $wnioskujacy['bKomorka'],
            'cNazwa' => $wnioskujacy['bNazwa'],
            'cNazwaWyswietlana' => $wnioskujacy['bNazwaWyswietlana'],
            'cNazwisko' => $wnioskujacy['bNazwisko'],
            'cNrewid' => $wnioskujacy['bNrewid'],
            'cStanowisko' => $wnioskujacy['bStanowisko']
        ];
        return $this->Api->AktualizujParametryNadgodziny($this->_getGid(), $options);
    }

    public function dajNowy($nrewid = null)
    {
        $options = [];
        $resp = null;
        $address = [];

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


            $rodzaj_edycji = 'Dodawanie';

            $type = $this->request->getData('run');
            $tab = $this->request->getData('tab');
            $formularz = $this->request->getData('formularz');

            if (isset($formularz[0]['name']) && $formularz[0]['name'] == 'RodzajeZapisu' && !empty($formularz[0]['value'])) {
                $options['RodzajZapisu'] = $formularz[0]['value'];
            }

            switch ($tab) {
                case 'moje':
                    if ($type == 'add-wybor' && isset($options['RodzajZapisu']) && $options['RodzajZapisu'] == 'Realizacja') {
                        $this->viewBuilder()->setTemplate('realizacja');

                        $options['Dzien'] = !empty($formularz[1]['value']) ? $formularz[1]['value'] . 'T00:00:00' : "1900-01-01T00:00:00";
                        $resp = $this->Api->DajWniosekZlecenieDoOkreslonejRealizacji($this->_getGid(), $options);

                    } else {
                        $this->viewBuilder()->setTemplate('formularz');

                        $options['Przynaleznosc'] = 'Moje';
                        $options['Nrewid'] = $nrewid;
                        $resp = $this->Api->DajNowaNadgodzine($this->_getGid(), $options);
                    }
                    break;
                case 'pracownikow':
                    if ($type == 'add-wybor' && isset($options['RodzajZapisu']) && $options['RodzajZapisu'] == 'Realizacja') {
                        $this->viewBuilder()->setTemplate('realizacja');

                        $type = 'pracownikow-add';
                        $options['Nrewid'] = isset($formularz[1]) && $formularz[1]['name'] == 'data[bNadgodzina][bNumerPracownika]' ? $formularz[1]['value'] : 0;
                        $options['Dzien'] = isset($formularz[2]) && $formularz[2]['name'] == 'data[bNadgodzina][bDzien]' && !empty($formularz[2]['value']) ? $formularz[2]['value'] . 'T00:00:00' : "1900-01-01T00:00:00";

                        $this->adresy($options['Nrewid'], $options['AdresWnioskujacego']);
                        $resp = $this->Api->DajWniosekZlecenieDoOkreslonejRealizacji($this->_getGid(), $options);

                    } else if ($type == 'add-wybor') {
                        $this->viewBuilder()->setTemplate('formularz');

                        $options['Nrewid'] = !empty($formularz[1]['name']) ? $formularz[1]['value'] : 0;
                        $type = 'pracownikow-add';
                        $address = $this->adresy($nrewid, $wnioskujacy);
                        $resp = $this->Api->DajNowaNadgodzine($this->_getGid(), $options);
                    }
                    break;
            }

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

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

            $context = $this->fillDataToRequest($resp);

            $this->set(compact('context', 'type', 'tab', 'rodzaj_edycji', 'resp', 'address'));

        } else {

            $this->viewBuilder()->setTemplate('wybor');
            $rodzaj_edycji = 'Wybor';
            $type = 'add-wybor';
            $tab = $this->request->getQuery('tab');

            if ($tab == 'moje') {
                $options['Przynaleznosc'] = 'Moje';
            } elseif ($tab == 'pracownikow') {
                $options['Przynaleznosc'] = 'MoichPracownikow';
                $address = $this->adresy($nrewid, $wnioskujacy);
            }

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

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

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

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

            $this->set(compact('type', 'tab', 'rodzaj_edycji', 'resp', 'address', 'resp2'));

        }


    }

    private function fillDataToRequest($resp)
    {
        $context = '';
        if (isset($resp['bNadgodzina'])) {
            $this->request = $this->request->withData('bNadgodzina', [
                'bDzien' => $resp['bNadgodzina']['bDzien'],
                'bDoOdbioruS' => $resp['bNadgodzina']['bDoOdbioruS'],
                'bDoWyplatyS' => $resp['bNadgodzina']['bDoWyplatyS'],
                'bGid' => $resp['bNadgodzina']['bGid'],
                'bGidWniosku' => $resp['bNadgodzina']['bGidWniosku'],
                'bRealizacjaDoS' => $resp['bNadgodzina']['bRealizacjaDoS'],
                'bRealizacjaGodzinS' => $resp['bNadgodzina']['bRealizacjaGodzinS'],
                'bRealizacjaOdS' => $resp['bNadgodzina']['bRealizacjaOdS'],
                'bUwagi' => $resp['bNadgodzina']['bUwagi'],
                'bWniosekDoS' => $resp['bNadgodzina']['bWniosekDoS'],
                'bWniosekGodzinS' => $resp['bNadgodzina']['bWniosekGodzinS'],
                'bWniosekOdS' => $resp['bNadgodzina']['bWniosekOdS'],
                'bUwagi' => $resp['bNadgodzina']['bUwagi'],
                'bDzienOdbioru0' => $resp['bNadgodzina']['bDzienOdbioru0'],
                'bDzienOdbioru1' => $resp['bNadgodzina']['bDzienOdbioru1'],
                'bDzienOdbioru2' => $resp['bNadgodzina']['bDzienOdbioru2'],
                'bDzienOdbioru3' => $resp['bNadgodzina']['bDzienOdbioru3'],
                'bDzienOdbioru4' => $resp['bNadgodzina']['bDzienOdbioru4'],
                'bOdbiorGodzin0S' => $resp['bNadgodzina']['bOdbiorGodzin0S'],
                'bOdbiorGodzin1S' => $resp['bNadgodzina']['bOdbiorGodzin1S'],
                'bOdbiorGodzin2S' => $resp['bNadgodzina']['bOdbiorGodzin2S'],
                'bOdbiorGodzin3S' => $resp['bNadgodzina']['bOdbiorGodzin3S'],
                'bOdbiorGodzin4S' => $resp['bNadgodzina']['bOdbiorGodzin4S'],
                'bTraktowanie' => $resp['bNadgodzina']['bTraktowanie'],
                'bPracownik' => $resp['bNadgodzina']['bAdresWnioskujacego']['cNazwaWyswietlana'],
            ]);

            $context = base64_encode(json_encode($resp['bNadgodzina']));
        }
        return $context;
    }

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

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

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

    public function zapisz($test = null)
    {
        $formularz = [];
        $context = null;
        $rodzaj_edycji = '';
        $odbior = 'Brak';
        $accept = 'false';
        $acceptAll = 'false';

        if ($this->request->is('post')) {
            $this->viewBuilder()->setLayout('ajax');
            $data = $this->request->getData('formularz');
            if (!empty($data)) {
                foreach ($data as $val) {
                    if (str_contains($val['name'], 'bNadgodzina')) {
                        $val['name'] = 'data[' . str_replace('bNadgodzina', 'bNadgodzina]', $val['name']);
                    }
                    preg_match_all('/\[(.*?)\]/', $val['name'], $matches);
                    if (!empty($matches[1][0]) && $matches[1][0] == 'ContextElemnts') {
                        $context = $val['value'];
                    } elseif (!empty($matches[1][0]) && $matches[1][0] == 'RodzajEdycji') {
                        $rodzaj_edycji = $val['value'];
                    } elseif (!empty($matches[1][0]) && $matches[1][0] == 'odbior') {
                        $odbior = $val['value'];
                    } elseif (!empty($matches[1][0]) && $matches[1][0] == 'accept') {
                        $accept = $val['value'];
                    } elseif (!empty($matches[1][0]) && $matches[1][0] == 'accept-all') {
                        $acceptAll = $val['value'];
                    } elseif (!empty($matches[1][0]) && $matches[1][0] == 'bNadgodzina' && isset($matches[1][1])) {
                        $formularz[$matches[1][1]] = $val['value'];
                    }
                }
            }
        }

        if (!empty($formularz) && $context !== null) {

            $obj = json_decode(base64_decode($context), true);

            $options = $this->mergeData($obj, $formularz,
                ['bDzien', 'bWniosekGodzinS', 'bWniosekOdS', 'bWniosekDoS', 'bRealizacjaOdS', 'bRealizacjaDoS', 'bRealizacjaGodzinS',
                    'bUwagi', 'bDoWyplatyS', 'bDoOdbioruS', 'bDzienOdbioru0', 'bOdbiorGodzin0S', 'bDzienOdbioru1', 'bOdbiorGodzin1S',
                    'bDzienOdbioru2', 'bOdbiorGodzin2S', 'bDzienOdbioru3', 'bOdbiorGodzin3S', 'bDzienOdbioru4', 'bOdbiorGodzin4S'],
                ['bDzien' => 'AddTime', 'bWniosekGodzinS' => 'FormatTime', 'bRealizacjaGodzinS' => 'FormatTime', 'bDoWyplatyS' => 'FormatTime',
                    'bDoOdbioruS' => 'FormatTime', 'bGodzinOdbioru0S' => 'FormatTime', 'bGodzinOdbioru1S' => 'FormatTime',
                    'bGodzinOdbioru2S' => 'FormatTime', 'bGodzinOdbioru3S' => 'FormatTime', 'bGodzinOdbioru4S' => 'FormatTime']);

            $options['CzyOdRazuZaakceptowac'] = $accept;
            $options['CzyOdRazuZaakceptowacZaWszystkich'] = $acceptAll;
            $options['RodzajEdycji'] = $rodzaj_edycji == 'Realizacja' ? 'Dodawanie' : $rodzaj_edycji;
            $options['bTraktowanie'] = $odbior;

            if ($test) {
                $options['pCzyTylkoTest'] = 'true';
            }

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

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

    public function operacje($id, $type)
    {
        $options = array(
            'gid' => $id,
            'CzyZaWszystkich' => 'false'
        );

        switch ($type) {
            case 1:
                $options['CzyWycofanieAkceptacji'] = 'false';
                break;
            case 2:
                $options['CzyWycofanieAkceptacji'] = 'true';
                break;
        }

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

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