<?php namespace App\Http\Controllers;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;

use App\Custom\SQLConnection;
use App\Custom\Misc;
use stdClass;

class ProcesosClientesController extends Controller
{
    private $servicio_contratado;

    /**
     * Funcion que devuelve
     * la interfaz que de los
     * clientes con sus servicios
     * @access public
     */
    public function panelesJSONClientes(){
        $servicio = Session::get('webdata')['servicio_contratado'];
        $clientes = SQLConnection::backendStoreProcedure('LED_Clientes', array('SELECT',NULL,NULL,NULL,NULL, 0, $servicio), 'select');
        //
        return view('procesos_clientes/json_clientes',compact('clientes'));
    }

    /**
     * Funcion que devuelve que
     * hace la llamada de generacion
     * del json de un servicio
     * @access public
     * @return string
     */
    public function generarJSON(){
        if ( isset($_POST['cliente']) && isset($_POST['servicio']) ){
            $cliente = $_POST['cliente'];
            $servicio = $_POST['servicio'];
            $this->servicio_contratado = Session::get('webdata')['servicio_contratado'];
            //
            $url = $this->urlServicio($servicio,$cliente);
            if ( $url['existe'] ){
                $response = json_decode(Misc::CURLCall($url['url'],NULL,'GET',200));
                //
                if ( $response && isset($response->error) ){
                    if ( $response->error == 0 ){
                        return Response::JSON(['error' => 0, 'mensaje' => 'OK: '.$response->mensaje.'.']);
                    } else {
                        if ( isset($response->mensaje) ){
                            return Response::JSON(['error' => 4, 'mensaje' => 'Error recibido: '.$response->mensaje.'.']);
                        } else {
                            return Response::JSON(['error' => 4, 'mensaje' => 'Error recibido: Sin motivo de error.']);
                        }
                    }
                } else {
                    return Response::JSON(['error' => 3, 'mensaje' => 'Cuerpo de respuesta no es JSON.']);
                }
            } else {
                return Response::JSON(['error' => 2, 'mensaje' => 'Servicio desconocido.']);
            }
            //
        } else {
            return Response::JSON(['error' => 1, 'mensaje' => 'Los datos recibidos son insuficientes.']);
        }
    }

    /**
     * Funcion que devuelve los
     * datos de los paneles de los
     * clientes solicitados
     * @access public
     * @return string 
     */
    public function panelesClientesData(){
        if ( isset($_POST['clientes']) && isset($_POST['servicios']) ){
            $clientes = $_POST['clientes'];
            $servicios = $_POST['servicios'];
            $this->servicio_contratado = Session::get('webdata')['servicio_contratado'];
            //
            $response = $this->clientesJSONData($clientes,$servicios);
            //
            return Response::JSON(['error' => 0, 'mensaje' => 'OK','datos' => $response]);
        } else {
            return Response::JSON(['error' => 1, 'mensaje' => 'Parametros Invalidos.']);
        }
    }

    /**
     * Funcion que devuelve
     * los datos de los paneles
     * de los clientes
     * @access private
     * @param array los clientes
     * @param array los servicios de los clientes
     * @return array
     */
    private function clientesJSONData($clientes,$servicios){
        $response = [];
        $obj = null;
        //
        foreach( $servicios as $servicio ){    
            foreach($clientes as $cliente){
                if ( is_numeric($cliente) ){
                    $obj = new \stdClass;
                    $obj->cliente = $cliente;
                    $obj->servicio = $servicio;
                    $obj->fecha = $this->fechaModificacionJSON($cliente,$servicio);
                    //
                    array_push($response,$obj);
                } else {
                    throw new Exception('Datos Invalidos Recibidos.');
                }
            }
        }
        //
        /* foreach($clientes as $cliente){
            if ( is_numeric($cliente) ){
                $obj = new \stdClass;
                $obj->cliente = $cliente;
                foreach( $servicios as $servicio ){    
                    $obj->$servicio = $this->fechaModificacionJSON($cliente,$servicio);
                }
                //
                array_push($response,$obj);
            } else {
                throw new Exception('Datos Invalidos Recibidos.');
            }
        } */
        //
        return $response;
    }

    /**
     * Funcion que devuelve
     * la fecha de modificación
     * de un JSON de cliente
     * @access private
     * @param string el numero de cliente
     * @param string el numero de servicio
     * @return DateTime|null
     */
    private function fechaModificacionJSON($cliente,$servicio){
        $fecha_modificacion = NULL;
        $path = NULL;
        //
        /* if ( $servicio == 'D' ){
            if ( $this->servicio_contratado == env('IV_PRODUCTO') ){
                $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'Dashboard'.DIRECTORY_SEPARATOR.$this->servicio_contratado.DIRECTORY_SEPARATOR.$cliente.DIRECTORY_SEPARATOR;
            } elseif ( $this->servicio_contratado == env('LED_PRODUCTO') ){
                $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'Dashboard'.DIRECTORY_SEPARATOR.$this->servicio_contratado.DIRECTORY_SEPARATOR.$cliente.'.json';
            }
        } elseif ( $servicio == 'P' ){
            if ( $this->servicio_contratado == env('IV_PRODUCTO') ){
                $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'IV-PANEL'.DIRECTORY_SEPARATOR.$cliente.DIRECTORY_SEPARATOR.'panel-iv.json';
            } elseif ( $this->servicio_contratado == env('LED_PRODUCTO') ){
                $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'LED-PANEL'.DIRECTORY_SEPARATOR.$cliente.DIRECTORY_SEPARATOR.'panel.json';
            }
        } */
        if ( $servicio == 'D' ){
            // $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'Dashboard'.DIRECTORY_SEPARATOR.$this->servicio_contratado.DIRECTORY_SEPARATOR.$cliente.'.json';
            $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'Dashboard'.DIRECTORY_SEPARATOR.$this->servicio_contratado.DIRECTORY_SEPARATOR.$cliente.DIRECTORY_SEPARATOR;
        } elseif ( $servicio == 'P' && $this->servicio_contratado == env('IV_PRODUCTO') ){
            $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'IV-PANEL'.DIRECTORY_SEPARATOR.$cliente.DIRECTORY_SEPARATOR.'panel-iv.json';
        } elseif ( $servicio == 'P' && $this->servicio_contratado == env('LED_PRODUCTO') ){
            $path = env('PATH_COMPARTIDO').DIRECTORY_SEPARATOR.'LED-PANEL'.DIRECTORY_SEPARATOR.$cliente.DIRECTORY_SEPARATOR.'panel.json';
        }
        //
        if ( file_exists($path) ){
            $fecha_modificacion = filemtime($path);
            $fecha_modificacion = date('Y-m-d H:i:s',$fecha_modificacion);
        }
        //
        return $fecha_modificacion;
    }

    /**
     * Funcion que arma la url
     * con las rutas ya cargadas
     * @access private
     * @param string el id del servicio
     * @param string el id del cliente
     * @return array
     */
    private function urlServicio($servicio,$cliente){
        $ruta = $this->determinarWebServicio();
        $existe = false;
        //
        $param = ['cliente' => $cliente];
        if ( $servicio == 'D' ){
            // Dashboard
            $ruta .= '/json/dashboard/usuarios';
            $existe = true;
            $param['servicio_contratado'] = $this->servicio_contratado;
        } elseif ( $servicio == 'P' &&  $this->servicio_contratado == env('LED_PRODUCTO') ){
            // Panel de Control
            $ruta .= '/led/led-panel-control-file';
            $existe = true;
            $param['cs'] = 'C';
        } elseif ( $servicio == 'P' &&  $this->servicio_contratado == env('IV_PRODUCTO') ){
            // Panel de Control
            $ruta .= '/iv/iv-panel-control-file';
            $existe = true;
            $param['servicio_contratado'] = $this->servicio_contratado;
        }
        //
        $param = http_build_query($param);
        //
        $ruta .= '?'.$param;
        //
        return array('url' => $ruta,'existe' => $existe);
    }

    /**
     * Funcion que devuelve la
     * web de clientes indicada
     * para usar en el servicio
     * de regeneración
     * @access private
     * @return string
     */
    private function determinarWebServicio(){
        if ( $this->servicio_contratado == env('IV_PRODUCTO') ){
            return env('URL_INQUIRO_CLI');
        } elseif ( $this->servicio_contratado == env('IMPE_PRODUCTO') ){
            return env('URL_IMPERIUM_CLI');
        } else {
            return env('URL_FRONTEND');
        }
    }

}
