<?php

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

class stampanti_model extends CI_Model
{
    public $mySqlDB;

    function __construct()
    {
        parent::__construct();
        $this->load->model('utility_model');
        $this->mySqlDB= $this->load->database("mysql", TRUE);
    }

    public function getStampanti()
    {
        $stampantiReturn = null;
        $myDB;

        try {
            
            $myDB = $this->mySqlDB;
            $this->utility_model->settaOutputErrorDatabase($myDB, FALSE);

            $query = "
            SELECT
                  ip
                , porta
                , descrizione
                , modello
            FROM stampanti";

            $res = $myDB->query($query);
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            $this->utility_model->checkDatabaseError($myDB, $res);

            $stampantiReturn = $this->utility_model->utf8ize($res->result());
            $stampantiReturn = json_encode($stampantiReturn);
        } catch (Exception $e) {
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            throw $e;
        }

        return $stampantiReturn;
    }

    public function inserisciStampante($ip, $porta, $descrizione, $modello)
    {
        $myDB;

        try {

            // Genero un'eccezione se l'ip della stampante è già presente
            $blnStampanteEsistente = $this->verificaStampanteEsistenze($ip, $descrizione);
            if ($blnStampanteEsistente)
                throw new Exception("È già presente una stampante con ip $ip");

            // Compongo la query di insert
            $myDB = $this->mySqlDB;
            $this->utility_model->settaOutputErrorDatabase($myDB, FALSE);
            $query = "
            INSERT INTO stampanti(
                  ip
                , porta
                , descrizione
                , modello
            ) VALUES (
                  '$ip'
                ,  $porta
                , '$descrizione'
                , '$modello'
            )";

            $res = $myDB->query($query);
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            $this->utility_model->checkDatabaseError($myDB, $res);

        } catch (Exception $e) {
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            throw $e;
        }
    }

    public function aggiornaStampante($ip, $porta, $descrizione, $modello)
    {
        $myDB;
        try {

            $myDB = $this->mySqlDB;
            $this->utility_model->settaOutputErrorDatabase($myDB, FALSE);

            $query = "
            UPDATE stampanti SET
                  porta = $porta
                , descrizione = '$descrizione'
                , modello = '$modello'
            WHERE
                ip = '$ip'";

            $res = $myDB->query($query);
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            $this->utility_model->checkDatabaseError($myDB, $res);
        } catch (Exception $e) {
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            throw $e;
        }
    }

    public function eliminaStampante($ip)
    {
        $myDB;

        try {
            $myDB = $this->mySqlDB;
            $this->utility_model->settaOutputErrorDatabase($myDB, FALSE);

            $query = "DELETE FROM stampanti WHERE ip = '$ip'";

            $res = $myDB->query($query);
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            $this->utility_model->checkDatabaseError($myDB, $res);
        } catch (Exception $e) {
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            throw $e;
        }
    }

    public function verificaStampanteEsistenze($ip, $descrizione)
    {
        $myDB;
        try {

            $myDB = $this->mySqlDB;
            $this->utility_model->settaOutputErrorDatabase($myDB, FALSE);

            $query = "
            SELECT
                  ip
                , porta
                , descrizione
            FROM stampanti
            WHERE
                ip = '$ip'
				AND descrizione = '$descrizione'
				";

            $res = $myDB->query($query);
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            $this->utility_model->checkDatabaseError($myDB, $res);

            $blnVerificaOK = ($res->num_rows() >= 1);

            return $blnVerificaOK;
        } catch (Exception $e) {
            $this->utility_model->settaOutputErrorDatabase($myDB, TRUE);
            throw $e;
        }
    }

    public function ping($ip)
    {
        try {

            $pingOK = 'false';
            exec("ping -n 1 " . $ip, $output, $result);
            
            $strTestoPing = strtoupper($output[2]);

            // Restituisco true se le seguenti stringhe non sono contenute nella risposta del ping
            if(
            strpos($strTestoPing, 'NON RAGGIUNGIBILE') === false &
            strpos($strTestoPing, 'RICHIESTA SCADUTA') === false) {
                $pingOK = 'true';
            }

            // COMMENTATO IN QUANTO, IN QUALCHE CASO RESTITUISCE TRUE 
            // ANCHE PER IP CHE NON SONO RAGGIUNGIBILI
            // if ($result == 0) {
            //     // Ping successful;
            //     $pingOK = 'true';
            // } 

        } catch (Exception $e) {
            throw $e;
        }

        return $pingOK;
    }
}
