<?php

use App\Models\User;
use Illuminate\Support\Facades\Http;
use Livewire\Livewire;
use Modules\AiAgent\Filament\Pages\ViewEvChatHistory;
use Spatie\Permission\Models\Permission;

beforeEach(function () {
    config([
        'services.bnfexpress.ai_api_url' => 'https://bnfexpress.test',
        'services.bnfexpress.client_id' => 'ev_admin',
        'services.bnfexpress.client_secret' => 'test-secret',
    ]);

    Permission::findOrCreate('manage_ai_agent', 'web');

    $this->admin = User::factory()->create()->givePermissionTo(['manage_ai_agent']);
    $this->actingAs($this->admin);
});

test('a user without manage_ai_agent cannot access it', function () {
    $this->actingAs(User::factory()->create());

    expect(ViewEvChatHistory::canAccess())->toBeFalse();
});

test('it lists sessions from the client', function () {
    Http::fake(['bnfexpress.test/admin/ev/history*' => Http::response([
        'total' => 1,
        'limit' => 25,
        'offset' => 0,
        'sessions' => [
            ['session_id' => 'sess-1', 'user_id' => 'user-1', 'title' => 'Charging question', 'last_message' => 'Thanks!', 'updated_at' => now()->toIso8601String()],
        ],
    ])]);

    Livewire::test(ViewEvChatHistory::class)
        ->assertOk()
        ->loadTable()
        ->assertSee('Charging question');
});

test('viewing a transcript shows its messages', function () {
    Http::fake([
        'bnfexpress.test/admin/ev/history/user-1/sess-1' => Http::response([
            'session_id' => 'sess-1',
            'user_id' => 'user-1',
            'messages' => [
                ['author' => 'user', 'text' => 'How do I charge my EV?', 'timestamp' => now()->timestamp],
                ['author' => 'bnfexpress_ev_agent', 'text' => 'Plug it in at a station.', 'timestamp' => now()->timestamp],
            ],
        ]),
        'bnfexpress.test/admin/ev/history*' => Http::response([
            'total' => 1,
            'limit' => 25,
            'offset' => 0,
            'sessions' => [
                ['session_id' => 'sess-1', 'user_id' => 'user-1', 'title' => 'Charging question', 'last_message' => 'Thanks!', 'updated_at' => now()->toIso8601String()],
            ],
        ]),
    ]);

    Livewire::test(ViewEvChatHistory::class)
        ->loadTable()
        ->mountTableAction('view', 'user-1:sess-1')
        ->assertMountedActionModalSee('Plug it in at a station.');
});

test('a failed transcript fetch surfaces the gateway detail message', function () {
    Http::fake([
        'bnfexpress.test/admin/ev/history/user-1/sess-1' => Http::response(['detail' => 'Session not found.'], 404),
        'bnfexpress.test/admin/ev/history*' => Http::response([
            'total' => 1,
            'limit' => 25,
            'offset' => 0,
            'sessions' => [
                ['session_id' => 'sess-1', 'user_id' => 'user-1', 'title' => 'Charging question', 'last_message' => 'Thanks!', 'updated_at' => now()->toIso8601String()],
            ],
        ]),
    ]);

    Livewire::test(ViewEvChatHistory::class)
        ->loadTable()
        ->mountTableAction('view', 'user-1:sess-1')
        ->assertMountedActionModalSee('Session not found.')
        ->assertNotified('Could not load transcript');
});
