<?php

namespace App\Http\Middleware;

use Closure;

// {} Controladores
use App\Http\Controllers\Controlador;

// {} Librerías

// ! Base de datos
use Illuminate\Support\Facades\DB;

// {} Clase
class Peticiones {

	public function handle($request, Closure $next) {

		$api = $request->is('api/*');

		if (!$api && !auth()->check())
			return $next($request)
		;

		$ruta = [
			'nombre' => $api ? $request->programa : $request->route()->getName(),
			'permisos' => ['visualizar' => false],
			'excepciones' => [
				'autenticacion.iniciar',
				'autenticacion.cerrar',
				'esquema',
				'ejecutar',
				'impresion',
				'inicio',
				'perfil'
			]
		];

		if ($api) {

			if ($ruta['nombre'] === 'autenticacion.iniciar')
				return $next($request);
			else
				$request->api = json_decode($request->api);

		} else {

			if (!auth()->check())
				return $next($request)
			;

		}

		$conexion = [
			'hospedaje' => $api ? $request->api->hospedaje : session('conexion')->hospedaje,
			'puerto' => $api ? $request->api->puerto : session('conexion')->puerto,
			'base_datos' => $api ? $request->api->base_datos : session('conexion')->base_datos,
			'usuario' => $api ? $request->api->usuario : session('conexion')->usuario,
			'contrasena' => $api ? $request->api->contrasena : session('conexion')->contrasena
		];

    config([
      'database.connections.sqlsrv.host' => $conexion['hospedaje'],
      'database.connections.sqlsrv.port' => $conexion['puerto'],
      'database.connections.sqlsrv.database' => $conexion['base_datos'],
      'database.connections.sqlsrv.username' => $conexion['usuario'],
      'database.connections.sqlsrv.password' => $conexion['contrasena']
    ]);

    DB::purge();

    DB::reconnect();

		$ruta['permisos']['visualizar'] = boolval(DB::select("SELECT dbo.f_tiene_permiso (?, ?, ?) AS permiso", [
			$api ? $request->id_usuario : session('usuario')->id_usuario,
			'visualizar',
			$ruta['nombre']
		])[0]->permiso);

		if (!$api) {

			$controlador = new Controlador;

			session($controlador->sesion($request));

			if (!in_array($ruta['nombre'], $ruta['excepciones'])) {

				session()->put('programa', $ruta['nombre']);

			} else if (!$request->programa && session('programa') !== 'registros.programas')
				$request['programa'] = session('programa')
			;

		}

		if ($ruta['permisos']['visualizar'] || in_array($ruta['nombre'], $ruta['excepciones']))
			return $next($request);
		else
			abort(403)
		;

	}

}
