<?php

namespace App\Http\Middleware;

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

class UiMode
{
    public const MODES = ['classic', 'simple'];
    public const COOKIE = 'ui_mode';

    /**
     * Resolve the UI mode (classic or simple) from the ?ui= query param, the
     * logged-in user's saved preference, or a long-lived cookie — in that
     * order. An explicit ?ui= choice is persisted to both the cookie and (for
     * logged-in users) their preference row, so it follows them across
     * devices. When simple mode is active, prepend the resources/views/simple
     * directory to the view finder so any view that has a simple variant is
     * used automatically, while everything else falls back to the default
     * views.
     */
    public function handle(Request $request, Closure $next): Response
    {
        $user = $request->user();
        $mode = $request->query('ui');

        if (in_array($mode, self::MODES, true)) {
            Cookie::queue(self::COOKIE, $mode, 60 * 24 * 365);
            $user?->preferences()->updateOrCreate([], ['ui_mode' => $mode]);
        } else {
            $mode = $user?->preferences?->ui_mode ?? $request->cookie(self::COOKIE);
            if (!in_array($mode, self::MODES, true)) {
                $mode = 'classic';
            }
        }

        if ($mode === 'simple') {
            View::prependLocation(resource_path('views/simple'));
        }

        $request->attributes->set('ui_mode', $mode);
        View::share('uiMode', $mode);

        return $next($request);
    }
}
