<?php

declare(strict_types=1);

namespace App\Support\System;

use App\Filament\System\Pages\Directory\Tenants;
use App\Filament\System\Pages\Directory\ViewTenant;
use App\Filament\System\Pages\Directory\ViewWorkspace;
use App\Filament\System\Pages\Directory\Workspaces;
use App\Models\ManagedEnvironment;
use App\Models\Workspace;
use App\Support\ManagedEnvironmentLinks;

final class SystemDirectoryLinks
{
    public static function workspacesIndex(): string
    {
        return Workspaces::getUrl(panel: 'system');
    }

    public static function workspaceDetail(Workspace|int $workspace): string
    {
        $workspaceId = $workspace instanceof Workspace ? (int) $workspace->getKey() : (int) $workspace;

        return ViewWorkspace::getUrl(['workspace' => $workspaceId], panel: 'system');
    }

    public static function tenantsIndex(): string
    {
        return Tenants::getUrl(panel: 'system');
    }

    public static function tenantDetail(ManagedEnvironment|string|int $tenant): string
    {
        $tenantRouteKey = self::tenantRouteKey($tenant);

        return ViewTenant::getUrl(['tenant' => $tenantRouteKey], panel: 'system');
    }

    public static function adminWorkspace(Workspace|int $workspace): string
    {
        $workspaceId = $workspace instanceof Workspace ? (int) $workspace->getKey() : (int) $workspace;

        return route('filament.admin.resources.workspaces.view', ['record' => $workspaceId]);
    }

    public static function adminTenant(ManagedEnvironment|string|int $tenant): string
    {
        $environment = $tenant instanceof ManagedEnvironment
            ? $tenant
            : ManagedEnvironment::query()->forTenant($tenant)->first();

        return $environment instanceof ManagedEnvironment
            ? ManagedEnvironmentLinks::viewUrl($environment)
            : url('/admin');
    }

    private static function tenantRouteKey(ManagedEnvironment|string|int $tenant): string
    {
        if ($tenant instanceof ManagedEnvironment) {
            return (string) $tenant->getRouteKey();
        }

        return (string) $tenant;
    }
}
