<?php

use App\Models\ManagedEnvironment;
use App\Services\Intune\ManagedEnvironmentRequiredPermissionsViewModelBuilder;

it('builds copy payload as newline-separated missing permissions for the selected type', function (): void {
    $rows = [
        [
            'key' => 'DeviceManagementApps.Read.All',
            'type' => 'application',
            'description' => null,
            'features' => ['backup'],
            'status' => 'missing',
            'details' => null,
        ],
        [
            'key' => 'DeviceManagementApps.ReadWrite.All',
            'type' => 'application',
            'description' => null,
            'features' => ['backup'],
            'status' => 'granted',
            'details' => null,
        ],
        [
            'key' => 'Group.Read.All',
            'type' => 'delegated',
            'description' => null,
            'features' => ['directory-groups'],
            'status' => 'missing',
            'details' => null,
        ],
        [
            'key' => 'Policy.Read.All',
            'type' => 'application',
            'description' => null,
            'features' => ['conditional-access'],
            'status' => 'missing',
            'details' => null,
        ],
    ];

    $payload = ManagedEnvironmentRequiredPermissionsViewModelBuilder::deriveCopyPayload($rows, 'application');

    expect($payload)->toBe(implode("\n", [
        'DeviceManagementApps.Read.All',
        'Policy.Read.All',
    ]));
});

it('respects the feature filter for copy payload', function (): void {
    $rows = [
        [
            'key' => 'A',
            'type' => 'delegated',
            'description' => null,
            'features' => ['f1', 'f2'],
            'status' => 'missing',
            'details' => null,
        ],
        [
            'key' => 'B',
            'type' => 'delegated',
            'description' => null,
            'features' => ['f2'],
            'status' => 'missing',
            'details' => null,
        ],
        [
            'key' => 'C',
            'type' => 'delegated',
            'description' => null,
            'features' => ['f3'],
            'status' => 'missing',
            'details' => null,
        ],
    ];

    $payload = ManagedEnvironmentRequiredPermissionsViewModelBuilder::deriveCopyPayload($rows, 'delegated', ['f2']);

    expect($payload)->toBe(implode("\n", [
        'A',
        'B',
    ]));
});

it('ignores search terms for copy payload but respects the feature filter', function (): void {
    $permissionService = \Mockery::mock(\App\Services\Intune\ManagedEnvironmentPermissionService::class);
    $permissionService->shouldReceive('compare')
        ->andReturn([
            'overall_status' => 'missing',
            'permissions' => [
                [
                    'key' => 'Match.Me',
                    'type' => 'application',
                    'description' => 'Some description',
                    'features' => ['f1'],
                    'status' => 'missing',
                    'details' => null,
                ],
            ],
        ]);

    $builder = new ManagedEnvironmentRequiredPermissionsViewModelBuilder($permissionService);
    $tenant = ManagedEnvironment::factory()->make(['external_id' => 'tenant-copy-a', 'name' => 'ManagedEnvironment']);

    $vm = $builder->build($tenant, [
        'features' => ['f1'],
        'search' => 'does not match',
    ]);

    expect($vm['permissions'])->toBeEmpty();
    expect($vm['copy']['application'])->toBe('Match.Me');
});
