<?php

use App\Services\Graph\GraphContractRegistry;

beforeEach(function () {
    config()->set('graph_contracts.types.settingsCatalogPolicy', [
        'resource' => 'deviceManagement/configurationPolicies',
        'allowed_select' => ['id'],
        'allowed_expand' => [],
        'type_family' => ['#microsoft.graph.deviceManagementConfigurationPolicy'],
    ]);

    $this->registry = app(GraphContractRegistry::class);
});

it('preserves @odata.type in settingInstance and strips ids', function () {
    $settings = [
        [
            'id' => 's-1',
            'displayName' => 'Setting A',
            'settingInstance' => [
                '@odata.type' => '#microsoft.management.configuration.deviceManagementConfigurationSimpleSettingInstance',
                'simpleSettingValue' => ['value' => 10],
                'id' => 'si-1',
            ],
        ],
        [
            'displayName' => 'Setting B',
            'settingInstance' => [
                '@odata.type' => '#microsoft.management.configuration.deviceManagementConfigurationChoiceSettingInstance',
                'choiceSettingValue' => ['value' => 'opt1'],
                'children' => [
                    [
                        'id' => 'c-1',
                        '@odata.type' => '#child.type',
                        'someValue' => true,
                    ],
                ],
            ],
        ],
    ];

    $sanitized = $this->registry->sanitizeSettingsApplyPayload('settingsCatalogPolicy', $settings);

    expect($sanitized)->toBeArray();
    expect(count($sanitized))->toBe(2);

    // Top-level ids stripped
    expect(array_key_exists('id', $sanitized[0]))->toBeFalse();

    // Top-level @odata.type should be added if missing
    expect(isset($sanitized[0]['@odata.type']))->toBeTrue();
    expect($sanitized[0]['@odata.type'])->toBe('#microsoft.graph.deviceManagementConfigurationSetting');
    expect(isset($sanitized[1]['@odata.type']))->toBeTrue();
    expect($sanitized[1]['@odata.type'])->toBe('#microsoft.graph.deviceManagementConfigurationSetting');

    // @odata.type preserved at settingInstance
    expect(isset($sanitized[0]['settingInstance']['@odata.type']))->toBeTrue();
    expect(isset($sanitized[1]['settingInstance']['@odata.type']))->toBeTrue();

    // nested child keeps its @odata.type and stripped id
    expect(isset($sanitized[1]['settingInstance']['children'][0]['@odata.type']))->toBeTrue();
    expect(array_key_exists('id', $sanitized[1]['settingInstance']['children'][0]))->toBeFalse();
});
