<?php

namespace Tests\Feature;

use App\Livewire\Concerns\WithFleetContext;
use App\Models\Server;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Tests\TestCase;

/**
 * activeServer() calls fleet(), and pages call activeServer() several times per render, so the
 * fleet query used to run once per call. fleet() now memoises for the request — proven here by
 * counting the `servers` selects across multiple reads.
 */
class WithFleetContextTest extends TestCase
{
    use RefreshDatabase;

    public function test_fleet_query_runs_once_across_repeated_reads(): void
    {
        $server = Server::create(['name' => 'box', 'ip' => '10.0.0.1', 'ssh_port' => 22, 'status' => 'online']);
        $server->credential()->create(['username' => 'root', 'auth_type' => 'password', 'secret' => 'x']);

        $component = new class
        {
            use WithFleetContext;
        };

        DB::enableQueryLog();
        $component->fleet();
        $component->fleet();
        $component->activeServer(); // internally calls fleet() again

        $serverSelects = collect(DB::getQueryLog())
            ->filter(fn (array $q): bool => str_contains($q['query'], 'from "servers"'))
            ->count();
        DB::disableQueryLog();

        $this->assertSame(1, $serverSelects); // memoised: one query despite three fleet() reads
    }

    public function test_fleet_still_returns_the_fleet(): void
    {
        $a = Server::create(['name' => 'alpha', 'ip' => '10.0.0.1', 'ssh_port' => 22, 'status' => 'online']);
        $b = Server::create(['name' => 'bravo', 'ip' => '10.0.0.2', 'ssh_port' => 22, 'status' => 'online']);

        $component = new class
        {
            use WithFleetContext;
        };

        $ids = $component->fleet()->pluck('id');
        $this->assertTrue($ids->contains($a->id));
        $this->assertTrue($ids->contains($b->id));
    }
}
