<?php

use App\Filament\Resources\PolicyVersionResource;
use App\Models\ManagedEnvironment;
use App\Models\Policy;
use App\Models\PolicyVersion;
use App\Models\User;
use App\Services\Graph\GraphClientInterface;
use App\Support\Workspaces\WorkspaceContext;

use function Pest\Laravel\mock;

beforeEach(function () {
    putenv('INTUNE_TENANT_ID');
    unset($_ENV['INTUNE_TENANT_ID'], $_SERVER['INTUNE_TENANT_ID']);

    $this->tenant = ManagedEnvironment::factory()->create();
    $this->policy = Policy::factory()->create([
        'managed_environment_id' => $this->tenant->id,
    ]);

    $this->user = User::factory()->create();
    [$this->user, $this->tenant] = createUserWithTenant(tenant: $this->tenant, user: $this->user, role: 'owner', fixtureProfile: 'credential-enabled');
});

it('renders policy version view without any Graph calls during render', function () {
    mock(GraphClientInterface::class)
        ->shouldNotReceive('listPolicies')
        ->shouldNotReceive('getPolicy')
        ->shouldNotReceive('getOrganization')
        ->shouldNotReceive('applyPolicy')
        ->shouldNotReceive('getServicePrincipalPermissions')
        ->shouldNotReceive('request');

    $version = PolicyVersion::factory()->create([
        'managed_environment_id' => $this->tenant->id,
        'policy_id' => $this->policy->id,
        'version_number' => 1,
        'assignments' => [
            [
                'id' => 'assignment-1',
                'intent' => 'apply',
                'target' => [
                    '@odata.type' => '#microsoft.graph.groupAssignmentTarget',
                    'groupId' => 'group-123',
                ],
            ],
        ],
    ]);

    $this->actingAs($this->user);

    $response = $this
        ->withSession([
            WorkspaceContext::SESSION_KEY => (int) $this->tenant->workspace_id,
            WorkspaceContext::LAST_ENVIRONMENT_IDS_SESSION_KEY => [
                (string) $this->tenant->workspace_id => (int) $this->tenant->getKey(),
            ],
        ])
        ->get(PolicyVersionResource::getUrl('view', ['record' => $version], panel: 'admin', tenant: $this->tenant));

    $response->assertOk();
});
