<?php

use App\Models\Policy;
use App\Models\PolicyVersion;
use App\Models\ManagedEnvironment;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

it('renders policy version normalized settings for script policies', function (string $policyType, string $odataType) {
    $originalEnv = getenv('INTUNE_TENANT_ID');
    putenv('INTUNE_TENANT_ID=');

    $tenant = ManagedEnvironment::factory()->create();
    [$user, $tenant] = createUserWithTenant($tenant, role: 'owner');
    $this->actingAs($user);
    putenv('INTUNE_TENANT_ID='.$tenant->managed_environment_id);
    $tenant->makeCurrent();

    $policy = Policy::factory()->create([
        'managed_environment_id' => $tenant->id,
        'policy_type' => $policyType,
        'platform' => 'all',
        'display_name' => 'Script policy',
        'external_id' => 'policy-1',
    ]);

    config([
        'tenantpilot.display.show_script_content' => true,
    ]);

    $scriptContent = str_repeat('X', 20);
    if ($policyType === 'deviceShellScript') {
        $scriptContent = "#!/bin/zsh\n".str_repeat('X', 20);
    }

    $contentKey = in_array($policyType, ['deviceHealthScript', 'deviceComplianceScript'], true)
        ? 'detectionScriptContent'
        : 'scriptContent';

    $version = PolicyVersion::factory()->create([
        'policy_id' => $policy->id,
        'managed_environment_id' => $tenant->id,
        'policy_type' => $policyType,
        'snapshot' => [
            '@odata.type' => $odataType,
            'displayName' => 'Script policy',
            'description' => 'desc',
            $contentKey => $contentKey === 'scriptContent' ? $scriptContent : base64_encode($scriptContent),
        ],
    ]);

    $this->get(\App\Filament\Resources\PolicyVersionResource::getUrl('index').'?tenant='.(string) $tenant->external_id)
        ->assertSuccessful();

    $this->get(\App\Filament\Resources\PolicyVersionResource::getUrl('view', ['record' => $version]).'?tab=normalized-settings&tenant='.(string) $tenant->external_id)
        ->assertSuccessful();

    $originalEnv !== false
        ? putenv("INTUNE_TENANT_ID={$originalEnv}")
        : putenv('INTUNE_TENANT_ID');
})->with([
    ['deviceManagementScript', '#microsoft.graph.deviceManagementScript'],
    ['deviceShellScript', '#microsoft.graph.deviceShellScript'],
    ['deviceHealthScript', '#microsoft.graph.deviceHealthScript'],
    ['deviceComplianceScript', '#microsoft.graph.deviceComplianceScript'],
]);

it('renders diff tab with highlighted script content for script policies', function () {
    $originalEnv = getenv('INTUNE_TENANT_ID');
    putenv('INTUNE_TENANT_ID=');

    config([
        'tenantpilot.display.show_script_content' => true,
        'tenantpilot.display.max_script_content_chars' => 5000,
    ]);

    $tenant = ManagedEnvironment::factory()->create();
    [$user, $tenant] = createUserWithTenant($tenant, role: 'owner');
    $this->actingAs($user);
    putenv('INTUNE_TENANT_ID='.$tenant->managed_environment_id);
    $tenant->makeCurrent();

    $policy = \App\Models\Policy::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'policy_type' => 'deviceManagementScript',
        'platform' => 'windows',
    ]);

    $scriptOne = "# test\n".str_repeat("Write-Host 'one'\n", 40);
    $scriptTwo = "# test\n".str_repeat("Write-Host 'two'\n", 40);

    $v1 = \App\Models\PolicyVersion::factory()->create([
        'policy_id' => $policy->getKey(),
        'managed_environment_id' => $tenant->getKey(),
        'version_number' => 1,
        'policy_type' => 'deviceManagementScript',
        'platform' => 'windows',
        'snapshot' => [
            '@odata.type' => '#microsoft.graph.deviceManagementScript',
            'displayName' => 'My script',
            'scriptContent' => base64_encode($scriptOne),
        ],
    ]);

    $v2 = \App\Models\PolicyVersion::factory()->create([
        'policy_id' => $policy->getKey(),
        'managed_environment_id' => $tenant->getKey(),
        'version_number' => 2,
        'policy_type' => 'deviceManagementScript',
        'platform' => 'windows',
        'snapshot' => [
            '@odata.type' => '#microsoft.graph.deviceManagementScript',
            'displayName' => 'My script',
            'scriptContent' => base64_encode($scriptTwo),
        ],
    ]);

    $url = \App\Filament\Resources\PolicyVersionResource::getUrl('view', ['record' => $v2]).'?tenant='.(string) $tenant->external_id;

    $this->get($url.'&tab=diff')
        ->assertSuccessful()
        ->assertSeeText('Fullscreen')
        ->assertSeeText("- Write-Host 'one'")
        ->assertSeeText("+ Write-Host 'two'")
        ->assertSee('bg-danger-50', false)
        ->assertSee('bg-success-50', false);

    $originalEnv !== false
        ? putenv("INTUNE_TENANT_ID={$originalEnv}")
        : putenv('INTUNE_TENANT_ID');
});

it('renders diff tab with highlighted script content for device compliance scripts', function () {
    $originalEnv = getenv('INTUNE_TENANT_ID');
    putenv('INTUNE_TENANT_ID=');

    config([
        'tenantpilot.display.show_script_content' => true,
        'tenantpilot.display.max_script_content_chars' => 5000,
    ]);

    $tenant = ManagedEnvironment::factory()->create();
    [$user, $tenant] = createUserWithTenant(tenant: $tenant, role: 'owner');
    $this->actingAs($user);
    putenv('INTUNE_TENANT_ID='.$tenant->managed_environment_id);
    $tenant->makeCurrent();

    $policy = Policy::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'policy_type' => 'deviceComplianceScript',
        'platform' => 'windows',
    ]);

    $scriptOne = "# test\n".str_repeat("Write-Host 'one'\n", 40);
    $scriptTwo = "# test\n".str_repeat("Write-Host 'two'\n", 40);

    $v1 = PolicyVersion::factory()->create([
        'policy_id' => $policy->getKey(),
        'managed_environment_id' => $tenant->getKey(),
        'version_number' => 1,
        'policy_type' => 'deviceComplianceScript',
        'platform' => 'windows',
        'snapshot' => [
            '@odata.type' => '#microsoft.graph.deviceComplianceScript',
            'displayName' => 'My compliance script',
            'detectionScriptContent' => base64_encode($scriptOne),
        ],
    ]);

    $v2 = PolicyVersion::factory()->create([
        'policy_id' => $policy->getKey(),
        'managed_environment_id' => $tenant->getKey(),
        'version_number' => 2,
        'policy_type' => 'deviceComplianceScript',
        'platform' => 'windows',
        'snapshot' => [
            '@odata.type' => '#microsoft.graph.deviceComplianceScript',
            'displayName' => 'My compliance script',
            'detectionScriptContent' => base64_encode($scriptTwo),
        ],
    ]);

    $url = \App\Filament\Resources\PolicyVersionResource::getUrl('view', ['record' => $v2]).'?tenant='.(string) $tenant->external_id;

    $this->get($url.'&tab=diff')
        ->assertSuccessful()
        ->assertSeeText('Fullscreen')
        ->assertSeeText("- Write-Host 'one'")
        ->assertSeeText("+ Write-Host 'two'")
        ->assertSee('bg-danger-50', false)
        ->assertSee('bg-success-50', false);

    $originalEnv !== false
        ? putenv("INTUNE_TENANT_ID={$originalEnv}")
        : putenv('INTUNE_TENANT_ID');
});
