<?php

declare(strict_types=1);

namespace App\Filament\Concerns;

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 (! static::isScopedToTenant()) {
            $panel = Filament::getCurrentOrDefaultPanel();

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

        $tenant = Filament::getTenant();

        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);
    }
}
