<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class UUIDCheckMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        //!Validación importante
        //* 1- Tiene que recibir la uuid del dispositivo
        $uuid = trim($request->header('uuid'));

        //* 2- La uuid tiene que coincidir con el toquen
        $token = $request->header('authorization');
        $data = $token ? explode('|', $token) : [];

        $token_id = sizeof($data) ? ($data[0]) : null;
        $token_id = intval(preg_replace('/[^0-9]+/', '', $token_id), 10);


        //? Si tiene valores el token y la uuid continuamos con el ejercicio
        if (isset($uuid) && isset($token_id) && is_numeric($token_id)) {

            //* 3- Extraemos la uuid para comparar
            $uuid_registrado = $this->getUUID($token_id);

            if ($uuid_registrado !== $uuid) {
                //?Extraemos la data de usuario para un log más completo
                $user_data = json_encode($request->user());

                //* 4- Si la uuid no coincide, cerrar sessión de ese token inmediatamente
                if ($request->user()->currentAccessToken()->delete()) {
                    //* 5- Reportamos actividad sospechosa
                    Log::error('ATENCIÓN - ACTIVIDAD SOSPECHOSA =>  ' . $user_data);

                    return response()->json([
                        'message' => 'Acceso Inhabilitado'
                    ], 401);
                }
            } else {
                return $next($request);
            }
        }
        //? Si el token es nulo solo devolver un error
    }

    private function getUUID($token_id)
    {
        $result = DB::table('personal_access_tokens as pat')
            ->join('token_devices as td', 'td.personal_access_token_id', 'pat.id')
            ->where('pat.id', $token_id)
            ->select('td.uuid')
            ->first();

        if ($result)
            return $result->uuid;
    }
}
