<?php

declare(strict_types=1);

use App\Models\OperationRun;
use App\Models\ManagedEnvironment;
use App\Support\OpsUx\ActiveRuns;

it('returns false when tenant has no active runs', function (): void {
    $tenant = ManagedEnvironment::factory()->create();

    OperationRun::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'type' => 'inventory_sync',
        'status' => 'completed',
        'outcome' => 'succeeded',
        'initiator_name' => 'System',
    ]);

    expect(ActiveRuns::existForTenant($tenant))->toBeFalse();
});

it('returns true when tenant has queued runs', function (): void {
    $tenant = ManagedEnvironment::factory()->create();

    OperationRun::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'type' => 'inventory_sync',
        'status' => 'queued',
        'outcome' => 'pending',
        'created_at' => now(),
        'initiator_name' => 'System',
    ]);

    expect(ActiveRuns::existForTenant($tenant))->toBeTrue();
});

it('returns true when tenant has running runs', function (): void {
    $tenant = ManagedEnvironment::factory()->create();

    OperationRun::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'type' => 'inventory_sync',
        'status' => 'running',
        'outcome' => 'pending',
        'started_at' => now(),
        'initiator_name' => 'System',
    ]);

    expect(ActiveRuns::existForTenant($tenant))->toBeTrue();
});

it('returns false when tenant only has likely stale runs', function (): void {
    $tenant = ManagedEnvironment::factory()->create();

    OperationRun::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'type' => 'inventory_sync',
        'status' => 'queued',
        'outcome' => 'pending',
        'created_at' => now()->subWeeks(2),
        'started_at' => null,
        'initiator_name' => 'System',
    ]);

    expect(ActiveRuns::existForTenant($tenant))->toBeFalse();
});

it('is tenant scoped (other tenant active runs do not count)', function (): void {
    $tenantA = ManagedEnvironment::factory()->create();
    $tenantB = ManagedEnvironment::factory()->create();

    OperationRun::factory()->create([
        'managed_environment_id' => $tenantB->getKey(),
        'type' => 'inventory_sync',
        'status' => 'running',
        'outcome' => 'pending',
        'initiator_name' => 'System',
    ]);

    expect(ActiveRuns::existForTenant($tenantA))->toBeFalse();
});
