<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Symfony\Component\HttpFoundation\Response;

use App\Custom\SQLConnection;

class Api
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    // SM AGB public function handle(Request $request, Closure $next): Response
    public function handle(Request $request, Closure $next, string $mode = ''): Response
    {
        $api_key  = isset($_POST['apikey']) ? $_POST['apikey'] : '';
		$idioma = ( isset($_POST['idioma']) && ($_POST['idioma'] == 'eng' || $_POST['idioma'] == 'por' || $_POST['idioma'] == 'spa' ) ) ? $_POST['idioma'] : 'spa';
		//
		if(empty($api_key)){
			return  response()->json(array('error'=>'1','message' =>'Error: Your API key is not set or is invalid'));
		}
		/* 08/02/2022: en la funcion obtenerInfoApiKey, llamamos al SP [api_key_obtener_info_2022], que hace mas controles(de cliente, usuario, topes de consumos) */
		$url = explode('?',$_SERVER['REQUEST_URI'])[0];
	// SM AGB		$info = self::obtenerInfoApiKey($api_key,$url);
	if ($mode == 'strict') {
	    $info = SQLConnection::backendStoreProcedure('api_key_obtener_info_v4',array($api_key,$url),'selectOne');
	} else {
	    $info = self::obtenerInfoApiKey($api_key,$url);
	}

		if(empty($info)){
	            return response()->json(array('error'=>'1.0','message' =>'Error: Your API key is not set or is invalid'));
        	} else {
	            if (isset($info->error_apikey) && $info->error_apikey !== null) {
        	        return response()->json(array('error'=>'1.0','message' => 'Error: ' . $info->error_apikey . ', por favor contactese con el area comercial de Fidelitas al +54 11 5254 9950'));
	            }
			if ($info->error_token !== null) {
				return response()->json(array('error'=>'1.1','message' =>'Error: ' . $info->error_token . ', por favor contactese con el area comercial de Fidelitas al +54 11 5254 9950')); 
			}
			if ($info->error_cliente !== null) {
				return response()->json(array('error'=>'1.2','message' =>'Error: ' . $info->error_cliente . ', please contact the commercial department of Fidelitas at +54 11 5254 9950')); 
			}
			if ($info->error_usuario !== null) {
				return response()->json(array('error'=>'1.3','message' =>'Error: ' . $info->error_usuario . ', please contact the commercial department of Fidelitas at +54 11 5254 9950')); 
			}
			if ($info->error_consumos !== null) { 
				return response()->json(array('error'=>'1.4','message' =>'Error: ' . $info->error_consumos . ', please contact the commercial department of Fidelitas at +54 11 5254 9950')); 
			}
		}
		
		$usuario = new \stdClass();
		$usuario->user_id 							= $info->user_id;
		$usuario->first_name 						= $info->first_name;
		$usuario->last_name 						= $info->last_name;
		$usuario->email 							= $info->email;
		$usuario->producto 							= $info->producto;
		$usuario->cliente['client_id']				= $info->client_id;
		$usuario->codigo_idioma 					= $idioma;
		if(!empty($info)){
			/* 8/2/2022: sacamos el ver_consumos, porque lo hacemos en el SP que llama la funcion aneterior (obtenerInfoApiKey)
			$ver_consumos = self::ControlConsumos($info->client_id, $info->user_id, $info->producto); 
			if (!empty($ver_consumos))
			{
				if ($ver_consumos->permitir == '0')
				{
				if ($ver_consumos->mensaje == NULL) { $ver_consumos->mensaje = 'Usuario no autorizado'; }
				return  response()->json(array('error'=>'1','message' => $ver_consumos->mensaje . ', por favor contactese con el area comercial de Fidelitas al +54 11 5254 9950'));
				}
			}*/
			if (Api::isValidIP($info->ip)) {
				Session::put('usuario',$usuario);
				Session::put('externo',true);
				Session::put('sesion_externa',true);
				return $next($request);
			}else{
				return  response()->json(array('error'=>'1','message' =>'Error: The provided IP is invalid, please contact the commercial department of Fidelitas at +54 11 5254 9950 , su IP es : '. $_SERVER['REMOTE_ADDR']));
			}
		}else{
			return  response()->json(array('error'=>'2','message' =>'Error: Your provided API key is invalid, please contact the commercial department of Fidelitas at +54 11 5254 9950'));
		}
    }

	private static function obtenerInfoApiKey($api_key,$url=null){
        //dd($api_key, $url);
        $intentos = 3;
        $info = null;

        while ($intentos > 0 && empty($info)) {
            $info = SQLConnection::backendStoreProcedure('api_key_obtener_info_v3',array($api_key,$url),'selectOne');
            $intentos--;
        }
        
        return $info;
	    }

    private static function obtenerInfoApiKeySM($api_key,$url=null){
		//dd($api_key, $url);
		return SQLConnection::backendStoreProcedure('api_key_obtener_info_2022',array($api_key,$url),'selectOne');
	}

	private static function isValidIP($ips){
		$ips = explode(',',$ips); 
		if(in_array($_SERVER['REMOTE_ADDR'],$ips) || $ips[0] == 'ALL' ){ 
			return true;
		}
		//
		return false;
	}

	/**
	 * Summary of ControlConsumos
	 * @param mixed $cliente
	 * @param mixed $usuario
	 * @param mixed $prod
	 * @return mixed
	 * @phpstan-ignore-next-line
	 */
	private static function ControlConsumos($cliente, $usuario, $prod){
		$ver_consumos = SQLConnection::backendStoreProcedure('obtener_control_consumos',array($cliente, $usuario, $prod),'selectOne');
		return $ver_consumos;
	}
}
