<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Barryvdh\Debugbar\LaravelDebugbar;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class SuppressDebugbarForSmokeRequests
{
    public const COOKIE_NAME = 'tp_smoke_test';

    public const COOKIE_VALUE = 'ok';

    public const SESSION_KEY = 'tp_smoke_test';

    /**
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        if (! $this->shouldSuppressDebugbar($request)) {
            return $next($request);
        }

        $debugbar = app()->bound('debugbar') ? app('debugbar') : null;

        config(['debugbar.enabled' => false]);

        if ($debugbar instanceof LaravelDebugbar && $debugbar->isEnabled()) {
            $debugbar->disable();
        }

        return $next($request);
    }

    private function shouldSuppressDebugbar(Request $request): bool
    {
        if ($request->cookie(self::COOKIE_NAME) === self::COOKIE_VALUE) {
            return true;
        }

        if (! $request->hasSession()) {
            return false;
        }

        return $request->session()->get(self::SESSION_KEY) === self::COOKIE_VALUE;
    }
}