<?php

declare(strict_types=1);

use App\Models\OperationRun;
use App\Models\ManagedEnvironment;
use App\Services\System\AllowedTenantUniverse;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Validation\ValidationException;

uses(RefreshDatabase::class);

it('excludes the platform tenant from the allowed universe query (picker)', function () {
    $platformTenant = ManagedEnvironment::factory()->create([
        'managed_environment_id' => null,
        'external_id' => 'platform',
        'name' => 'Platform',
    ]);

    $customerTenant = ManagedEnvironment::factory()->create([
        'external_id' => 'tenant-1',
        'name' => 'ManagedEnvironment One',
    ]);

    $universe = app(AllowedTenantUniverse::class);

    $ids = $universe->query()->orderBy('id')->pluck('id')->all();

    expect($ids)->toContain((int) $customerTenant->getKey());
    expect($ids)->not->toContain((int) $platformTenant->getKey());
});

it('rejects attempts to target the platform tenant', function () {
    $platformTenant = ManagedEnvironment::factory()->create([
        'managed_environment_id' => null,
        'external_id' => 'platform',
        'name' => 'Platform',
    ]);

    $universe = app(AllowedTenantUniverse::class);

    expect(fn () => $universe->ensureAllowed($platformTenant))
        ->toThrow(ValidationException::class);

    expect(OperationRun::query()->count())->toBe(0);
});

it('resolves allowed tenant proposals by id and rejects the platform tenant', function () {
    $platformTenant = ManagedEnvironment::factory()->create([
        'managed_environment_id' => null,
        'external_id' => 'platform',
        'name' => 'Platform',
    ]);

    $customerTenant = ManagedEnvironment::factory()->create([
        'external_id' => 'tenant-2',
        'name' => 'ManagedEnvironment Two',
    ]);

    $universe = app(AllowedTenantUniverse::class);

    expect($universe->resolveAllowed((int) $customerTenant->getKey()))
        ->not->toBeNull()
        ->getKey()->toBe($customerTenant->getKey());

    expect(fn () => $universe->resolveAllowedOrFail((int) $platformTenant->getKey()))
        ->toThrow(ValidationException::class);
});
