<?php

declare(strict_types=1);

namespace App\Support\Navigation;

use Illuminate\Http\Request;

final class NavigationScope
{
    public static function isWorkspaceSurface(?Request $request = null): bool
    {
        return ! self::isEnvironmentSurface($request);
    }

    public static function isEnvironmentSurface(?Request $request = null): bool
    {
        return in_array(self::pageCategory($request), [
            AdminSurfaceScope::EnvironmentBound,
            AdminSurfaceScope::EnvironmentScopedEvidence,
        ], true);
    }

    public static function shouldRegisterEnvironmentNavigation(?Request $request = null): bool
    {
        return self::isEnvironmentSurface($request);
    }

    public static function pageCategory(?Request $request = null): AdminSurfaceScope
    {
        return AdminSurfaceScope::fromPath(self::effectivePath($request));
    }

    private static function effectivePath(?Request $request = null): string
    {
        $request ??= request();
        $path = '/'.ltrim((string) $request->path(), '/');

        if (! self::isLivewireUpdatePath($path)) {
            return $path;
        }

        $refererPath = parse_url((string) $request->headers->get('referer', ''), PHP_URL_PATH);

        return is_string($refererPath) && $refererPath !== ''
            ? '/'.ltrim($refererPath, '/')
            : $path;
    }

    private static function isLivewireUpdatePath(string $path): bool
    {
        return preg_match('#^/livewire(?:-[^/]+)?/update$#', $path) === 1;
    }
}
