<?php

declare(strict_types=1);

use App\Models\Finding;
use App\Models\Tenant;
use App\Services\Runbooks\FindingsLifecycleBackfillRunbookService;
use App\Services\Runbooks\FindingsLifecycleBackfillScope;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

beforeEach(function () {
    Filament::setCurrentPanel('system');
    Filament::bootCurrentPanel();

    Tenant::factory()->create([
        'tenant_id' => null,
        'external_id' => 'platform',
        'name' => 'Platform',
    ]);
});

it('computes single-tenant preflight counts', function () {
    $platformTenant = Tenant::query()->where('external_id', 'platform')->firstOrFail();

    $tenant = Tenant::factory()->create([
        'workspace_id' => (int) $platformTenant->workspace_id,
    ]);

    Finding::factory()->create([
        'tenant_id' => (int) $tenant->getKey(),
        'due_at' => null,
    ]);

    Finding::factory()->create([
        'tenant_id' => (int) $tenant->getKey(),
    ]);

    $service = app(FindingsLifecycleBackfillRunbookService::class);

    $result = $service->preflight(FindingsLifecycleBackfillScope::singleTenant((int) $tenant->getKey()));

    expect($result['total_count'])->toBe(2);
    expect($result['affected_count'])->toBe(1);
});

it('computes all-tenants preflight counts scoped to the platform workspace', function () {
    $platformTenant = Tenant::query()->where('external_id', 'platform')->firstOrFail();

    $tenantA = Tenant::factory()->create([
        'workspace_id' => (int) $platformTenant->workspace_id,
    ]);

    $tenantB = Tenant::factory()->create([
        'workspace_id' => (int) $platformTenant->workspace_id,
    ]);

    $otherTenant = Tenant::factory()->create();

    Finding::factory()->create([
        'tenant_id' => (int) $tenantA->getKey(),
        'due_at' => null,
    ]);

    Finding::factory()->create([
        'tenant_id' => (int) $tenantB->getKey(),
        'sla_days' => null,
    ]);

    Finding::factory()->create([
        'tenant_id' => (int) $otherTenant->getKey(),
        'due_at' => null,
    ]);

    $service = app(FindingsLifecycleBackfillRunbookService::class);

    $result = $service->preflight(FindingsLifecycleBackfillScope::allTenants());

    expect($result['estimated_tenants'])->toBe(2);
    expect($result['total_count'])->toBe(2);
    expect($result['affected_count'])->toBe(2);
});
