<?php

namespace ProxiumWXfrm\Auth;

//require_once("../config/config.php");
//require_once("../src/Proxium/Proxium.php");

use ProxiumWXfrm\Http\Response;
use ProxiumWXfrm\Proxium\PeticionWS;

use ProxiumWXfrm\Proxium\RespuestaStandard;

class Token {

    protected string $dispositivo_id;
    protected string $dispositivo_ip;
    protected string $token='';
    protected string $empresa=''; //empresa api proxium
    protected string $clave=''; //clave api proxium
    protected string $clavePrivada=''; //clave api privada definida en config


    public function __construct($dispositivo_id,$dispositivo_ip,$token,$empresa,$clave,$clavePrivada){

        global $configProxy;
        global $conexionBdd;

        $this->dispositivo_id=$dispositivo_id;
        $this->dispositivo_ip=$dispositivo_ip;
        $this->token=$token;
        $this->empresa=$empresa;
        $this->clave=$clave; 
        $this->clavePrivada=$clavePrivada; 

        /*
        $this->dispositivo_id = $dispositivo_id ? $dispositivo_id : '';
        $this->dispositivo_ip = $dispositivo_ip ? $dispositivo_ip : '';
        $this->token = $token ? $token : '';
        $this->empresa =  $empresa ? $empresa : '';
        $this->clave = $clave ? $clave : '';
        $this->clavePrivada = $clavePrivada ? $clavePrivada : '';
        */

        if($configProxy['sqliteBd']) {

            //CREACION DE LAS TABLAS SI NO EXISTEN
            
            $consulta1='
                CREATE TABLE IF NOT EXISTS proxiumapi_log (
                    Id INTEGER PRIMARY KEY AUTOINCREMENT,
                    Dispositivo_id varchar(256) NOT NULL,
                    Dispositivo_ip varchar(15) NOT NULL,
                    Token varchar(255),
                    Cuando datetime NOT NULL,
                    Peticion varchar(255) NOT NULL,
                    Parametros text NOT NULL
                )
            ';
            $consulta2='
                CREATE TABLE IF NOT EXISTS proxiumapi_tokens (
                    Id INTEGER PRIMARY KEY AUTOINCREMENT,
                    Dispositivo_id varchar(256) NOT NULL,
                    Dispositivo_ip varchar(15) NOT NULL,
                    Token varchar(255) NOT NULL,
                    Cuando datetime NOT NULL,
                    Duracion int NOT NULL
                )
            ';

            $conexionBdd->query($consulta1);
            $conexionBdd->query($consulta2);

        }

    }

    
    public function grabaLogPeticion($peticion,$parametros){

        global $conexionBdd;

        $parametrosJson=json_encode($parametros);

        $consulta='INSERT INTO proxiumapi_log (Dispositivo_id,Dispositivo_ip,Token,Cuando,Peticion,Parametros) VALUES (?,?,?,?,?,?)';
        $parametros=array($this->dispositivo_id,$this->dispositivo_ip,$this->token,date('Y-m-d h:i:s'),$peticion,$parametrosJson);
        
        try {

            $temp=$conexionBdd->prepare($consulta);
            $temp->execute($parametros);

        } catch (PDOException $e) {
                
            echo 'error';
        }
     
    }
    
    
    public function validaApiKeyPrivada():bool{

        global $configProxy; //apiKeyAppPrivada es la api key privada definida en el confi

        $validacion=($this->clavePrivada==$configProxy['apiKeyAppPrivada']);
        return $validacion;

    }

    public function validaApiKeyApp():bool{

        $urlLlamada='/validaApiKeyInst';

        $parametrosLlamada=json_encode(
            array(
                'Id'=>$this->dispositivo_id,
                'Emp'=>$this->empresa, 
                'Clave'=>$this->clave
            )
        );
        
        $peticion=new PeticionWS($urlLlamada,$parametrosLlamada);

        $resultadoLogin=$peticion->lanzaPostRaw(false);
        $resultadoLogin=json_decode($resultadoLogin);

        if(isset($resultadoLogin->valor)) {
            //VALIDACIÓN TEMPORAL, EL WS NO ESTÁ TERMINADO
            //$validacion=($resultadoLogin->nombre=='vicente' && $resultadoLogin->empresa=='gadir');
            $validacion=($resultadoLogin->valor=='OK');
        }
        else $validacion=false;
        
        //$validacion=true;
        return $validacion;

    }

    public function generaToken(){

        global $configProxy;
        global $conexionBdd;

        $token=bin2hex(random_bytes(16));
        
        $consulta='INSERT INTO proxiumapi_tokens (Dispositivo_id,Dispositivo_ip,Token,Cuando,Duracion) VALUES (?,?,?,?,?)';
        $parametros=array($this->dispositivo_id,$this->dispositivo_ip,$token,date('Y-m-d h:i:s'),$configProxy['duracionToken']);
        try {

            $temp=$conexionBdd->prepare($consulta);
            $temp->execute($parametros);

            $this->token=$token;
            
            $respuesta=array(
                'token'=>$token,
                'validez'=>$configProxy['duracionToken']
            );
            
            //$response=Response::json($respuesta);
            $response=Response::text(RespuestaStandard::data($respuesta)->getRespuesta());

        } catch (PDOException $e) {
               
            $response=Response::text(RespuestaStandard::error(101,"Error interno. Ha sido imposible generar token.")->getRespuesta());

        }
        
        
        //BORRAR TOKENS CADUCADOS DEL USUARIO YA CADUCADOS
        //$consulta='DELETE FROM proxiumapi_tokens WHERE Dispositivo_id=? AND Dispositivo_ip=? AND TIME_TO_SEC(TIMEDIFF(now(),Cuando))>Duracion';
        //$parametros=array($this->dispositivo_id,$this->dispositivo_ip);
        //$temp=$conexionBdd->prepare($consulta);
        //$temp->execute($parametros);
        
        //$response=Response::text("token generado: ".$token);

        return $response;
  
    }

    public function validaToken():bool{

        global $conexionBdd;

        $tokenValido=false;

        $consulta='SELECT * FROM proxiumapi_tokens WHERE Dispositivo_id=? AND Dispositivo_ip=? AND Token=? AND TIME_TO_SEC(TIMEDIFF(?,Cuando))<=Duracion';
        $parametros=array($this->dispositivo_id,$this->dispositivo_ip,$this->token,date('Y-m-d h:i:s'));
        try {

            $temp=$conexionBdd->prepare($consulta);
            $temp->execute($parametros);

            if($temp->rowCount()==1) $tokenValido=true;

        } catch (PDOException $e) {
            //echo 'Error: '.$e->getMessage();
        }

        return $tokenValido;
        
    }

}

?>