<?php

declare(strict_types=1);

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;

uses(RefreshDatabase::class);

test('super admin can see impersonation action for normal user', function (): void {
    $admin = User::factory()->superAdmin()->create();
    $normalUser = User::factory()->normalUser()->create();

    Livewire::actingAs($admin)
        ->test(\App\Filament\Resources\UserResource\Pages\ListUsers::class)
        ->assertCanSeeTableRecords([$normalUser])
        ->assertActionVisible('impersonate', $normalUser);
});

test('super admin cannot see impersonation action for super admin', function (): void {
    $admin = User::factory()->superAdmin()->create();
    $targetAdmin = User::factory()->superAdmin()->create();

    Livewire::actingAs($admin)
        ->test(\App\Filament\Resources\UserResource\Pages\ListUsers::class)
        ->assertCanSeeTableRecords([$targetAdmin])
        ->assertActionHidden('impersonate', $targetAdmin);
});

test('normal user cannot see impersonation action', function (): void {
    $normalUser = User::factory()->normalUser()->create();
    $targetUser = User::factory()->normalUser()->create();

    Livewire::actingAs($normalUser)
        ->test(\App\Filament\Resources\UserResource\Pages\ListUsers::class)
        ->assertCanSeeTableRecords([$targetUser])
        ->assertActionHidden('impersonate', $targetUser);
});

test('impersonation action is hidden when already impersonating', function (): void {
    $admin = User::factory()->superAdmin()->create();
    $targetUser = User::factory()->normalUser()->create();
    $impersonationService = app(\App\Services\ImpersonationService::class);

    // Simulate active impersonation
    session(['impersonation' => true, 'original_admin_user_id' => $admin->id]);

    Livewire::actingAs($admin)
        ->test(\App\Filament\Resources\UserResource\Pages\ListUsers::class)
        ->assertCanSeeTableRecords([$targetUser])
        ->assertActionHidden('impersonate', $targetUser);
});

test('stop impersonation action is visible when impersonating', function (): void {
    $admin = User::factory()->superAdmin()->create();
    $targetUser = User::factory()->normalUser()->create();
    $impersonationService = app(\App\Services\ImpersonationService::class);

    // Simulate active impersonation
    session(['impersonation' => true, 'original_admin_user_id' => $admin->id]);

    Livewire::actingAs($targetUser)
        ->test(\App\Filament\Resources\UserResource\Pages\ListUsers::class)
        ->assertActionVisible('stopImpersonation');
});

test('stop impersonation action is hidden when not impersonating', function (): void {
    $admin = User::factory()->superAdmin()->create();

    Livewire::actingAs($admin)
        ->test(\App\Filament\Resources\UserResource\Pages\ListUsers::class)
        ->assertActionHidden('stopImpersonation');
});

test('impersonation action works correctly', function (): void {
    $admin = User::factory()->superAdmin()->create();
    $targetUser = User::factory()->normalUser()->create();

    Livewire::actingAs($admin)
        ->test(\App\Filament\Resources\UserResource\Pages\ListUsers::class)
        ->assertCanSeeTableRecords([$targetUser])
        ->callAction('impersonate', $targetUser);

    // Should redirect to dashboard
    // Note: This test may need adjustment based on your actual redirect logic
    $this->assertTrue(true); // Placeholder - actual assertion would depend on your implementation
});
