<?php

defined('BASEPATH') or exit('No direct script access allowed');

class Ws extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('ws_model');
        $this->load->model('utility_model');
        $this->load->model('zpl_etichette');
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST');
        header("Access-Control-Allow-Headers: X-Requested-With");
        define("IS_CLIENTE", "0");
    }

    /**
     * Index Page for this controller.
     *
     * Maps to the following URL
     * 		http://example.com/index.php/welcome
     * 	- or -
     * 		http://example.com/index.php/welcome/index
     * 	- or -
     * Since this controller is set as the default controller in
     * config/routes.php, it's displayed at http://example.com/
     *
     * So any other public methods not prefixed with an underscore will
     * map to /index.php/welcome/<method_name>
     * @see https://codeigniter.com/user_guide/general/urls.html
     */
    //    public function index() {
    //        if (!$this->ion_auth->logged_in()) {
    //            redirect('auth/login');
    //        }
    //        $this->load->view('comune/header');
    //        $this->load->view('comune/navbar');
    //        $this->load->view('welcome_message');
    //        $this->load->view('comune/footer');
    //    }

    public function login()
    {
        $res = $this->ws_model->login($this->input->post('utente'), $this->input->post('password'));
        //            var_dump($res);
        if (empty($res)) {
            $res = array('errore' => 1);
        }
        echo json_encode($res);
    }
    public function localIP()
    {
        $localIP = getHostByName(getHostName());
        //$this->ws_model->delete_local_ip();
        //$this->ws_model->set_local_ip($localIP);
        $this->config->set_item('base_url', 'http://' . $localIP . '/stampa-etichette-backend/');
        echo $localIP;
    }

    function utf8ize($d)
    {
        if (is_array($d))
            foreach ($d as $k => $v)
                $d[$k] = $this->utf8ize($v);

        else if (is_object($d))
            foreach ($d as $k => $v)
                $d->$k = $this->utf8ize($v);
        else
            return utf8_encode($d);

        return $d;
    }

    public function get_fornitori()
    {
        ini_set('max_execution_time', 500);
        $fornitori = $this->ws_model->get_fornitori($this->input->post('query'));
        if ($this->input->get('callback') != '') {
            echo $this->input->get('callback') . '(' . json_encode($this->utf8ize($fornitori)) . ')';
        } else {
            echo json_encode($this->utf8ize($fornitori));
        }
    }

    public function get_n_matricole()
    {
        $matricola = $this->ws_model->get_matricola($this->input->post('dati')['articolo'], $this->input->post('dati')['matricola']);

        echo json_encode(array(
            'numero' => count($matricola),
            'json' => $this->utf8ize($matricola)
        ));
    }

    public function get_articoli()
    {
        ini_set('max_execution_time', 0);
        $articoli = $this->ws_model->get_articoli_autocomplete($this->input->post('query'));
        if ($this->input->get('callback') != '') {
            echo $this->input->get('callback') . '(' . json_encode($this->utf8ize($articoli)) . ')';
        } else {
            echo json_encode($this->utf8ize($articoli));
        }
    }

    public function spegnimento()
    {
        exec("assets\\shutdown.bat");
    }

    public function stampa_etichette_qrcode()
    {
        $annoEstintore = substr($this->input->post('dati')['anno'], 0, 4);
        $codFor = explode('-', $this->input->post('dati')['fornitore']);
        $codiceFornitoreEstintore = $codFor[0];
        $codiceFornitoreEstintore = str_pad(trim($codiceFornitoreEstintore), 5, ' ');
        $matricolaFornitore = $this->input->post('dati')['matricola'];
        $matricolaFornitore = str_pad(trim($matricolaFornitore), 8, ' ');
        $articolo_artar = $this->ws_model->get_articoli_etichetta($this->input->post('dati')['articolo']);

        $ipStampante = $this->input->post('dati')['ipStampante'];
        $portaStampante = $this->input->post('dati')['portaStampante'];
        $modelloStampante = $this->input->post('dati')['modelloStampante'];

        $tipoEstintore = '';
        if (!empty($articolo_artar))
            $tipoEstintore = trim($articolo_artar[0]->ARCA05);
        else
            throw new Exception('Articolo non trovato');

        $unitaDiMisura = 'NR';
        $peso = str_pad(number_format($articolo_artar[0]->ARPES, 1, '', ''), 5, '0', STR_PAD_LEFT);

        $codiceBarcode = $annoEstintore . $codiceFornitoreEstintore . $matricolaFornitore . $unitaDiMisura . $peso . $this->input->post('dati')['articolo'];

        $etichette = new zpl_etichette(
            IS_CLIENTE,
            '', // codice + descrizione articolo
            $articolo_artar[0]->ARCDA, // codice Articolo
            $articolo_artar[0]->ARDES, // descrizione Articolo
            $matricolaFornitore,
            $annoEstintore,
            $codiceBarcode, // qrCode
            '', // data_revisione
            '', // data_collaudo
            '', // data_scadenza_revisione,
            ''
        ); // data_scadenza_collaudo

        // $file_pointer = fopen("C:\\Users\\user02\\Desktop\\TEST\\test.txt", "a+");
        // fwrite($file_pointer,  var_export($etichette->QRCODE, true));

        try {
            $this->ws_model->invia_stampa($ipStampante, $portaStampante, $etichette->QRCODE);
        } catch (Exception $e) {
            $this->utility_model->restituisciErroreWS($e);
            exit;
        }
    }

    public function differenza_date($data1 = null, $data2 = null)
    {

        $datetime1 = new DateTime(date('Y-m-d H:i:s', strtotime(str_replace('/', '-', $data1)))); //start time
        $datetime2 = new DateTime(date('Y-m-d H:i:s', strtotime(str_replace('/', '-', $data2)))); //end time

        $interval = $datetime2->diff($datetime1);

        $res = array();
        $res['anni'] = $interval->format('%Y');
        $res['mesi'] = $interval->format('%m');
        $res['giorni'] = $interval->format('%d');
        $res['ore'] = $interval->format('%H');
        $res['minuti'] = $interval->format('%i');
        $res['secondi'] = $interval->format('%s');
        $res['invert'] = $interval->invert;

        return $res;
    }

    function stampa_etichette_grandi($datiQRCode = null)
    {

        $data_scadenza_collaudo = '';
        $data_collaudo = '';
        $ipStampante = '';
        $portaStampante = '';
        $modelloStampante = '';

        if (!$this->input->post('QRCode') && !empty($this->input->post('dati'))) {

            /****************************************
             * STAMPA LIBERA DA PWA STAMPA ETICHETTE
             ****************************************/
            $annoEstintore = '';
            $codiceFornitoreEstintore = '';
            $matricolaFornitore = '';
            $ARCDA = '';
            $ARDES = '';

            // Definisco e inizializzo le variabili per la data di revisione e scadenza revisione
            $data_revisione = '...';
            $data_scadenza_revisione = '...';

            // Definisco e inizializzo le variabili per la data di collaudo e scadenza collaudo
            $data_collaudo = '...';
            $data_scadenza_collaudo = '...';

            /***********************************************
             *  CALCOLO DATE REVISIONE - SCADENZA REVISIONE --------------------------------------------->> OBBLIGATORIE!!
             ***********************************************/
            $dataRevisione = $this->input->post('dati')['data_revisione'];
            $dataScadenzaRevisione = $this->input->post('dati')['data_scadenza_revisione'];

            $data_revisione = $dataRevisione;
            $data_scadenza_revisione = $dataScadenzaRevisione;
            // $data_revisione = $this->formattaDataRevisione($dataRevisione, "m/y");
            // $data_scadenza_revisione = $this->calcolaDataScadenzaRevisione($data_revisione, $dataScadenzaRevisione, 3,"m/y");

            /*********************************************
             *  CALCOLO DATE COLLAUDO - SCADENZA COLLAUDO --------------------------------------------->> OPZIONALI!!
             *********************************************/
            $dataCollaudo = $this->input->post('dati')['data_collaudo'];
            $dataScadenzaCollaudo = $this->input->post('dati')['data_scadenza_collaudo'];

            $data_collaudo = $dataCollaudo;
            $data_scadenza_collaudo = $dataScadenzaCollaudo;
            // $data_collaudo = $this->calcolaDataCollaudo($dataCollaudo);
            // $data_scadenza_collaudo = $this->calcolaDataScadenzaCollaudo($dataCollaudo, $dataScadenzaCollaudo, 12);

            $ipStampante = $this->input->post('dati')['ipStampante'];
            $portaStampante = $this->input->post('dati')['portaStampante'];
            $modelloStampante = $this->input->post('dati')['modelloStampante'];
        } else {

            /****************************************
             * STAMPA DA LISTENER STAMPA ETICHETTE
             ****************************************/

            $annoEstintore = substr($datiQRCode['anno'], 0, 4);
            $data_estintore = date("y/m/d", mktime(0, 0, 0, date('m'), date('d'), $annoEstintore));

            $codiceFornitoreEstintore = $datiQRCode['fornitore'];
            $codiceFornitoreEstintore = str_pad(trim($codiceFornitoreEstintore), 5, ' ');

            $matricolaFornitore = $datiQRCode['matricola'];
            $matricolaFornitore = str_pad(trim($matricolaFornitore), 8, ' ');

            $articolo_artar = $this->ws_model->get_articoli_Listener($datiQRCode['articolo']);

            $ARCDA = $articolo_artar[0]->ARCDA;
            $ARDES = $articolo_artar[0]->ARDES;

            $datiMatricola = $this->ws_model->get_matricola($ARCDA, $matricolaFornitore);
            $ANNI_COLLAUDO = $datiMatricola[0]->AA_COLLAUDO;
            $ANNI_REVISIONE =  $datiMatricola[0]->AA_REVISIONE;

            $data_collaudo = '';
            $data_scadenza_collaudo = '';

            // $file_pointer = fopen("C:\\Users\\user02\\Desktop\\TEST\\test.txt", "a+");
            // fwrite($file_pointer,  var_export($ANNI_COLLAUDO, true));


            if (!empty($datiQRCode['anno']) && $datiQRCode['anno'] != '---') {

                $anno_scadenza_scorso_collaudo = $datiQRCode['anno'];
                $anno_scadenza_prossimo_collaudo = $datiQRCode['anno'] + $ANNI_COLLAUDO;

                while ($anno_scadenza_prossimo_collaudo <= date('Y')) {
                    $anno_scadenza_scorso_collaudo = $anno_scadenza_prossimo_collaudo;
                    $anno_scadenza_prossimo_collaudo = $anno_scadenza_prossimo_collaudo + $ANNI_COLLAUDO;
                }
                $data_scadenza_collaudo = date("m/y", mktime(0, 0, 0, date('m'), date('d'), $anno_scadenza_prossimo_collaudo));
                $data_collaudo = date("m/y", mktime(0, 0, 0, date('m'), date('d'), $anno_scadenza_scorso_collaudo));

                $diff_date = $this->differenza_date($data_collaudo, $data_estintore);
                // fwrite($file_pointer, "ANNO QECODE " . $datiQRCode['anno'] . "DATA COLLAUDO " . $data_collaudo . ' DATA ESTINTORE ' .  $data_estintore . 'DIFF DATE ' . $diff_date['anni']);
                if ($diff_date['anni'] == 0) {
                    $data_collaudo = '';
                }
            }

            $data_revisione = date("m/y", mktime(0, 0, 0, date('m'), date('d'), date('Y')));
            $data_scadenza_revisione = date("m/y", mktime(0, 0, 0, date('m'), date('d'), date('Y') + $ANNI_REVISIONE));

            $ipStampante = $datiQRCode['ipStampante'];
            $portaStampante = $datiQRCode['portaStampante'];
            $modelloStampante = $datiQRCode['modelloStampante'];
        }

        $articolo = trim($ARCDA) . "-" . substr($ARDES, 0, 30);

        try {
            // In base al modello della stampante, stabilisco l'etichetta da stampare
            $etichette = new zpl_etichette(
                IS_CLIENTE,
                $articolo,
                '', // codice Articolo
                '', // descrizione Articolo
                $matricolaFornitore,
                $annoEstintore,
                '', // qrCode
                $data_revisione,
                $data_collaudo,
                $data_scadenza_revisione,
                $data_scadenza_collaudo
            );

            // $file_pointer = fopen("C:\\Users\\user02\\Desktop\\TEST\\test.txt", "a+");
            // fwrite($file_pointer,  var_export($etichette->GRANDE_GK420T, true));

            $print_data = "";
            switch ($modelloStampante) {
                case 'ZT230':
                    $print_data = $etichette->GRANDE_ZT230;
                    break;
                case 'GK420T':
                    $print_data = $etichette->GRANDE_GK420T;
                    break;
                default:
                    $print_data = $etichette->GRANDE_GK420T;
                    break;
            }

            // fwrite($file_pointer, $print_data . '************');
            $this->ws_model->invia_stampa($ipStampante, $portaStampante, $print_data);
        } catch (Exception $e) {
            $this->utility_model->restituisciErroreWS($e);
            exit;
        }
    }

    public function inserisci_matricola()
    {
        echo $this->ws_model->inserisci_matricola($this->input->post('dati'));
    }

    public function recupera_qr_code()
    {
        $QR_CODE = $this->input->post('QRCode');

        $arraytojson['anno'] = substr($QR_CODE, 0, 4);
        $arraytojson['fornitore'] = substr($QR_CODE, 4, 5);
        $arraytojson['matricola'] = substr($QR_CODE, 9, 8);
        $arraytojson['articolo'] = substr($QR_CODE, 24, strlen($QR_CODE) - 24);

        $arraytojson['ipStampante'] = $this->input->post('IpStampante');
        $arraytojson['portaStampante'] = $this->input->post('PortaStampante');
        $arraytojson['modelloStampante'] = $this->input->post('ModelloStampante');

        // Inizializzo le variabili vuote, tanto le ricalcolo nella funzione successiva
        $arraytojson['data_collaudo'] = '';
        $arraytojson['data_scadenza_collaudo'] = '';
        $arraytojson['data_revisione'] = '';
        $arraytojson['data_scadenza_revisione'] = '';

        if ($this->stampa_etichette_grandi($arraytojson)) {
            echo 'TRUE';
        } else {
            echo 'FALSE';
        }
    }

    public function formattaDataRevisione($dataRevisione, $formato)
    {
        $data_revisione = '...';
        if (!empty($dataRevisione)) {
            $data_revisione = $this->formattaData($formato, $dataRevisione);
        }
        return  $data_revisione;
    }

    public function calcolaDataScadenzaRevisione($dataRevisione, $dataScadenzaRevisione, $anniRevisione, $formato)
    {

        list($dd_dataRev, $mm_dataRev, $yyyy_dataRev) = explode("/", $dataRevisione);

        if (empty($dataScadenzaRevisione) && $dataRevisione != '...') {
            $data_scadenza_revisione = date($formato, mktime(0, 0, 0, $mm_dataRev, $dd_dataRev, $yyyy_dataRev + $anniRevisione));
        } else {
            if ($dataRevisione != '...') {
                list($dd_dataScadRev, $mm_dataScadRev, $yyyy_dataScadRev) = explode("/", $dataScadenzaRevisione);
                $data_scadenza_revisione = date($formato, mktime(0, 0, 0, $mm_dataScadRev, $dd_dataScadRev, $yyyy_dataScadRev));
            } else {
                $data_scadenza_revisione = '...';
            }
        }
        return $data_scadenza_revisione;
    }

    public function calcolaDataCollaudo($dataCollaudo)
    {
        /* CODICE ORIGINALE, controllare!!!!
            if (!empty($dataScadenzaCollaudo)) {
                if (!empty($dataCollaudo)) {
                    list($dd_dataColl, $mm_dataColl, $yyyy_dataColl) = explode("/", $dataCollaudo);
                    $data_collaudo = date("m/y", mktime(0, 0, 0, $mm_dataColl, $dd_dataColl, $yyyy_dataColl));
                    list($today_scadenza_collaudo, $thisMonth_scadenza_collaudo, $thisYear_scadenza_collaudo) = explode("/", $dataScadenzaCollaudo);
                    $data_scadenza_collaudo = date("m/y", mktime(0, 0, 0, $thisMonth_scadenza_collaudo, $today_scadenza_collaudo, $thisYear_scadenza_collaudo));
                } else {
                    $data_collaudo = '...';
                    list($today_scadenza_collaudo, $thisMonth_scadenza_collaudo, $thisYear_scadenza_collaudo) = explode("/", $dataScadenzaCollaudo);
                    $data_scadenza_collaudo = date("m/y", mktime(0, 0, 0, $thisMonth_scadenza_collaudo, $today_scadenza_collaudo, $thisYear_scadenza_collaudo));
                }
            } else {
                if (!empty($dataCollaudo)) {
                    list($dd_dataColl, $mm_dataColl, $yyyy_dataColl) = explode("/", $dataCollaudo);
                    $data_collaudo = date("m/y", mktime(0, 0, 0, $mm_dataColl, $dd_dataColl, $yyyy_dataColl));
                    $data_scadenza_collaudo = date("m/y", mktime(0, 0, 0, $mm_dataColl, $dd_dataColl, ($yyyy_dataColl + 12)));
                } else {
                    $data_scadenza_collaudo = '...';
                    $data_collaudo = '...';
                }
            }
            */
        $data_collaudo = '...';
        if (!empty($dataCollaudo)) {
            $data_collaudo = $this->formattaData("m/y", $dataCollaudo);
        }
        return $data_collaudo;
    }

    public function calcolaDataScadenzaCollaudo($dataCollaudo, $dataScadenzaCollaudo, $anniCollaudo)
    {
        $data_scadenza_collaudo = '...';

        if (!empty($dataScadenzaCollaudo)) {
            list($dd_dataScadColl, $mm_dataScadColl, $yyyy_dataScadColl) = explode("/", $dataScadenzaCollaudo);
            $data_scadenza_collaudo = date("m/y", mktime(0, 0, 0, $mm_dataScadColl, $dd_dataScadColl, $yyyy_dataScadColl));
        } else {
            if (!empty($dataCollaudo)) {
                list($dd_dataColl, $mm_dataColl, $yyyy_dataColl) = explode("/", $dataCollaudo);
                $data_scadenza_collaudo = date("m/y", mktime(0, 0, 0, $mm_dataColl, $dd_dataColl, ($yyyy_dataColl + $anniCollaudo)));
            }
        }
        return  $data_scadenza_collaudo;
    }

    public function formattaData($formato, $dataPartenza)
    {
        $dataReturn = '';
        if (!empty($dataPartenza)) {
            list($dd, $mm, $yyyy) = explode("/", $dataPartenza);
            $dataReturn = date($formato, mktime(0, 0, 0, $dd, $mm, $yyyy));
        }
        return $dataReturn;
    }

    // Estrazione di tutte le caratteristiche 05, utilizzate dal calcolo delle scadenze di revisione/collaudo
    public function getCaratteristiche05()
    {
        $car05Return = $this->ws_model->getCaratteristiche05();
        if ($this->input->get('callback') != '') {
            echo $this->input->get('callback') . '(' . json_encode($this->utf8ize($car05Return)) . ')';
        } else {
            echo json_encode($this->utf8ize($car05Return));
        }
    }

    public function getArticolo()
    {
        $codArticolo = $this->input->post('codArticolo');
        echo $this->ws_model->getArticolo($codArticolo);
    }
}
