<?php

namespace Tests\Feature\Layout;

use App\Models\Auth\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Schema;
use Spatie\Permission\Models\Permission;
use Tests\TestCase;

/**
 * Menú lateral: es la única navegación de la aplicación y no tenía ningún test.
 *
 * Lo que se fija aquí es la ficha de usuario y el filtrado por permisos. La ficha
 * imprimía `last_name`, una columna que no existe en `users` (MGR-031): Eloquent
 * devuelve null para un atributo inexistente, así que nadie lo notó nunca.
 */
class NavigationTest extends TestCase
{
    use RefreshDatabase;

    private function usuario(array $permisos = [], array $atributos = []): User
    {
        foreach ($permisos as $nombre) {
            Permission::firstOrCreate(
                ['name' => $nombre, 'guard_name' => 'web'],
                ['model' => 'menu', 'description' => $nombre]
            );
        }

        $user = User::factory()->create($atributos);

        if ($permisos !== []) {
            $user->givePermissionTo($permisos);
        }

        $this->actingAs($user);
        Cache::flush();

        return $user;
    }

    public function test_la_tabla_users_no_tiene_columna_de_apellidos(): void
    {
        // Si algún día se añade, hay que revisar el menú y el saludo del Dashboard,
        // que hoy asumen un único campo `name`.
        $this->assertFalse(
            Schema::hasColumn('users', 'last_name'),
            'Se ha añadido `last_name`: revisar el menú lateral y Dashboard::bienvenida().'
        );
    }

    public function test_la_ficha_de_usuario_muestra_nombre_y_correo(): void
    {
        $this->usuario(['admin.dashboard.index'], [
            'name' => 'Antonio Manzano',
            'email' => 'antonio@ejemplo.test',
        ]);

        $this->get('/dashboard')
            ->assertOk()
            ->assertSee('Antonio Manzano')
            ->assertSee('antonio@ejemplo.test');
    }

    public function test_el_menu_solo_muestra_las_secciones_permitidas(): void
    {
        // Sólo entornos: no debe aparecer ni Usuarios ni API Logs.
        $this->usuario(['admin.dashboard.index', 'admin.environments.index']);

        $html = $this->get('/dashboard')->assertOk()->getContent();

        $this->assertStringContainsString('>Entornos<', $html);
        $this->assertStringNotContainsString('>Usuarios<', $html);
        $this->assertStringNotContainsString('>API Logs<', $html);
    }
}
