<?php

namespace Tests\Feature\Admin;

use App\Http\Middleware\UUIDCheckMiddleware;
use App\Models\Lubricante;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Laravel\Sanctum\Sanctum;
use Tests\Support\CreatesAdminApiUser;
use Tests\TestCase;

class LubricantesAdminTest extends TestCase
{
    use CreatesAdminApiUser;
    use RefreshDatabase;

    private const ENDPOINT = '/api/admin/lubricantes';

    protected function setUp(): void
    {
        parent::setUp();

        $this->withoutMiddleware(UUIDCheckMiddleware::class);
        $this->withHeader('X-Requested-With', 'XMLHttpRequest');
    }

    /**
     * Verifica que el CRUD quede detrás de `rootUser` y no alcance con un token
     * admin válido para modificar datos visibles en la web pública.
     */
    public function test_requires_root_permissions_for_lubricantes_crud(): void
    {
        [$admin] = $this->createAdminApiUser(false);
        Sanctum::actingAs($admin, ['admin']);

        $response = $this->postJson(self::ENDPOINT, [
            'titulo' => 'Petronas Syntium',
            'estado' => 1,
        ]);

        $response->assertStatus(406);
    }

    /**
     * Rechaza claves de filtro y columnas de orden no soportadas para evitar que
     * la grilla se convierta en una interfaz de consulta arbitraria.
     */
    public function test_rejects_unknown_filters_and_sorts(): void
    {
        [$admin] = $this->createAdminApiUser();
        Sanctum::actingAs($admin, ['admin']);

        $response = $this->getJson(self::ENDPOINT . '?filter[slug]=syntium&sort=-updated_at');

        $response
            ->assertUnprocessable()
            ->assertJsonValidationErrors(['filter.slug', 'sort']);
    }

    /**
     * Lista sólo columnas administrativas esperadas y permite filtrar por estado
     * sin exponer registros inactivos cuando el filtro lo pide.
     */
    public function test_lists_lubricantes_with_validated_filters(): void
    {
        [$admin] = $this->createAdminApiUser();
        Sanctum::actingAs($admin, ['admin']);

        Lubricante::query()->create(['titulo' => 'Petronas Syntium', 'estado' => 1]);
        Lubricante::query()->create(['titulo' => 'Petronas Inactivo', 'estado' => 0]);

        $response = $this->getJson(self::ENDPOINT . '?filter[estado]=1&page[size]=5');

        $response->assertOk();
        $response->assertJsonFragment(['titulo' => 'Petronas Syntium']);
        $response->assertJsonMissing(['titulo' => 'Petronas Inactivo']);
    }

    /**
     * `estado` debe seguir siendo binario. Aceptar otros números hace ambiguo el
     * comportamiento público y complica auditorías de contenido.
     */
    public function test_rejects_non_binary_status(): void
    {
        [$admin] = $this->createAdminApiUser();
        Sanctum::actingAs($admin, ['admin']);

        $response = $this->postJson(self::ENDPOINT, [
            'titulo' => 'Petronas Syntium',
            'estado' => 2,
        ]);

        $response
            ->assertUnprocessable()
            ->assertJsonValidationErrors(['estado']);
    }
}
