<?php

declare(strict_types=1);

use App\Jobs\RunInventorySyncJob;
use App\Notifications\OperationRunCompleted;
use App\Services\Intune\AuditLogger;
use App\Services\Inventory\InventorySyncService;
use App\Services\OperationRunService;

it('persists exactly one terminal notification for initiated inventory sync runs', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $sync = app(InventorySyncService::class);
    $selectionPayload = $sync->defaultSelectionPayload();
    $computed = $sync->normalizeAndHashSelection($selectionPayload);

    $mockSync = \Mockery::mock(InventorySyncService::class);
    $mockSync
        ->shouldReceive('executeSelection')
        ->once()
        ->andReturn([
            'status' => 'success',
            'had_errors' => false,
            'error_codes' => [],
            'error_context' => [],
            'errors_count' => 0,
            'items_observed_count' => 0,
            'items_upserted_count' => 0,
            'skipped_policy_types' => [],
            'processed_policy_types' => $computed['selection']['policy_types'],
            'failed_policy_types' => [],
            'selection_hash' => $computed['selection_hash'],
        ]);

    /** @var OperationRunService $operationRuns */
    $operationRuns = app(OperationRunService::class);
    $run = $operationRuns->ensureRun(
        tenant: $tenant,
        type: 'inventory_sync',
        inputs: $computed['selection'],
        initiator: $user,
    );

    $job = new RunInventorySyncJob(
        tenantId: (int) $tenant->getKey(),
        userId: (int) $user->getKey(),
        operationRun: $run,
    );

    expect($user->notifications()->count())->toBe(0);

    $job->handle($mockSync, app(AuditLogger::class), $operationRuns);

    $run->refresh();

    expect($run->status)->toBe('completed');
    expect($run->outcome)->toBe('succeeded');
    expect($user->notifications()->count())->toBe(1);

    $this->assertDatabaseHas('notifications', [
        'notifiable_id' => $user->getKey(),
        'notifiable_type' => $user->getMorphClass(),
        'type' => OperationRunCompleted::class,
    ]);
})->group('ops-ux');

it('does not persist terminal notifications for system-run inventory syncs without initiator', function (): void {
    [, $tenant] = createUserWithTenant(role: 'owner');

    $sync = app(InventorySyncService::class);
    $run = $sync->syncNow($tenant, $sync->defaultSelectionPayload());

    expect($run->status)->toBe('completed');
    expect($tenant->users()->firstOrFail()->notifications()->count())->toBe(0);
    $this->assertDatabaseCount('notifications', 0);
})->group('ops-ux');
