<?php

use App\Filament\Resources\RestoreRunResource;
use App\Models\BackupItem;
use App\Models\BackupSet;
use App\Models\ManagedEnvironment;
use App\Support\Workspaces\WorkspaceContext;

function makeAssignment(string $odataType, string $groupId, ?string $displayName = null): array
{
    $target = [
        '@odata.type' => $odataType,
        'groupId' => $groupId,
    ];

    if (is_string($displayName) && $displayName !== '') {
        $target['group_display_name'] = $displayName;
    }

    return ['target' => $target];
}

test('restore wizard create page renders without touching graph', function () {
    $tenant = ManagedEnvironment::factory()->create();
    [$user] = createUserWithTenant($tenant);

    bindFailHardGraphClient();

    $this->actingAs($user)
        ->withSession([
            WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id,
            WorkspaceContext::LAST_ENVIRONMENT_IDS_SESSION_KEY => [
                (string) $tenant->workspace_id => (int) $tenant->getKey(),
            ],
        ])
        ->get(RestoreRunResource::getUrl('create', panel: 'admin', tenant: $tenant))
        ->assertOk()
        ->assertSee('Create restore run')
        ->assertSee('Select Backup Set');
});

test('restore wizard group mapping renders DB-only with manual GUID UX', function () {
    $tenant = ManagedEnvironment::factory()->create();
    [$user] = createUserWithTenant($tenant);

    $backupSet = BackupSet::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'name' => 'group-mapping-backup-set',
    ]);

    $groupId = '11111111-2222-3333-4444-555555555555';
    $expectedMasked = '…'.substr($groupId, -8);

    BackupItem::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'backup_set_id' => $backupSet->getKey(),
        'assignments' => [
            makeAssignment('#microsoft.graph.groupAssignmentTarget', $groupId, 'Example Group'),
        ],
    ]);

    bindFailHardGraphClient();

    $url = RestoreRunResource::getUrl('create', panel: 'admin', tenant: $tenant).'?backup_set_id='.$backupSet->getKey();

    $this->actingAs($user)
        ->withSession([
            WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id,
            WorkspaceContext::LAST_ENVIRONMENT_IDS_SESSION_KEY => [
                (string) $tenant->workspace_id => (int) $tenant->getKey(),
            ],
        ])
        ->get($url)
        ->assertOk()
        ->assertSee($expectedMasked)
        ->assertSee('Paste the target Entra ID group Object ID')
        ->assertSee('Use SKIP to omit the assignment.');
});
