<?php

declare(strict_types=1);

use App\Filament\Pages\Reviews\CustomerReviewWorkspace;
use App\Models\AuditLog;
use App\Models\ManagedEnvironment;
use App\Models\User;
use App\Models\Workspace;
use App\Models\WorkspaceMembership;
use App\Support\Audit\AuditActionId;
use App\Support\Workspaces\WorkspaceContext;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

it('returns 404 for users outside the active workspace on the customer review workspace', function (): void {
    $workspace = Workspace::factory()->create();
    $user = User::factory()->create();

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $workspace->getKey()])
        ->get(CustomerReviewWorkspace::getUrl(panel: 'admin'))
        ->assertNotFound();
});

it('returns 404 for workspace members that have no environment review visibility in the active workspace', function (): void {
    $workspace = Workspace::factory()->create();
    $user = User::factory()->create();

    WorkspaceMembership::factory()->create([
        'workspace_id' => (int) $workspace->getKey(),
        'user_id' => (int) $user->getKey(),
        'role' => 'owner',
    ]);

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $workspace->getKey()])
        ->get(CustomerReviewWorkspace::getUrl(panel: 'admin'))
        ->assertNotFound();
});

it('allows entitled workspace members to access the customer review workspace', function (): void {
    $tenant = ManagedEnvironment::factory()->create();
    [$user, $tenant] = createUserWithTenant(tenant: $tenant, role: 'readonly');

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(CustomerReviewWorkspace::getUrl(panel: 'admin'))
        ->assertOk();

    $audit = AuditLog::query()
        ->where('action', AuditActionId::CustomerReviewWorkspaceOpened->value)
        ->latest('id')
        ->first();

    expect($audit)->not->toBeNull()
        ->and($audit?->resource_type)->toBe('customer_review_workspace')
        ->and(data_get($audit?->metadata, 'source_surface'))->toBe(CustomerReviewWorkspace::SOURCE_SURFACE)
        ->and(data_get($audit?->metadata, 'entitled_tenant_count'))->toBe(1);
});

it('returns 404 for explicit out-of-scope tenant targeting on the customer review workspace', function (): void {
    $tenantAllowed = ManagedEnvironment::factory()->create(['name' => 'Allowed ManagedEnvironment']);
    [$user, $tenantAllowed] = createUserWithTenant(tenant: $tenantAllowed, role: 'readonly');

    $tenantDenied = ManagedEnvironment::factory()->create([
        'workspace_id' => (int) $tenantAllowed->workspace_id,
        'name' => 'Denied ManagedEnvironment',
    ]);
    $otherOwner = User::factory()->create();
    createUserWithTenant(tenant: $tenantDenied, user: $otherOwner, role: 'owner');

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenantAllowed->workspace_id])
        ->get(CustomerReviewWorkspace::getUrl(panel: 'admin').'?environment_id='.(string) $tenantDenied->getKey())
        ->assertNotFound();
});
