<?php

declare(strict_types=1);

namespace App\Filament\Concerns;

use App\Models\ManagedEnvironment;
use App\Support\OperateHub\OperateHubShell;
use App\Support\WorkspaceIsolation\TenantOwnedModelFamilies;
use Filament\Facades\Filament;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

trait ScopesGlobalSearchToTenant
{
    /**
     * The Eloquent relationship name used to scope records to the current tenant.
     */
    protected static string $globalSearchTenantRelationship = 'tenant';

    public static function getGlobalSearchEloquentQuery(): Builder
    {
        $query = static::getModel()::query();

        if (! TenantOwnedModelFamilies::supportsScopedGlobalSearch(static::getModel())) {
            return $query->whereRaw('1 = 0');
        }

        if (! static::isScopedToTenant()) {
            $panel = Filament::getCurrentOrDefaultPanel();

            if ($panel?->hasTenancy()) {
                $query->withoutGlobalScope($panel->getTenancyScopeName());
            }
        }

        $tenant = static::resolveGlobalSearchTenant();

        if (! $tenant instanceof Model) {
            return $query->whereRaw('1 = 0');
        }

        $user = auth()->user();

        if (! $user || ! method_exists($user, 'canAccessTenant') || ! $user->canAccessTenant($tenant)) {
            return $query->whereRaw('1 = 0');
        }

        return $query->whereBelongsTo($tenant, static::$globalSearchTenantRelationship);
    }

    protected static function resolveGlobalSearchTenant(): ?Model
    {
        if (Filament::getCurrentPanel()?->getId() === 'admin') {
            $tenant = app(OperateHubShell::class)->activeEntitledTenant(request());

            return $tenant instanceof ManagedEnvironment ? $tenant : null;
        }

        $tenant = Filament::getTenant();

        return $tenant instanceof Model ? $tenant : null;
    }
}
