<?php

namespace Tests\Feature;

use App\Models\Restaurante;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class RestauranteTest extends TestCase
{
    use RefreshDatabase;

    private function criarRestaurante(array $attrs = []): Restaurante
    {
        return Restaurante::create(array_merge([
            'nome'        => 'Restaurante Teste',
            'tipo_comida' => 'brasileira',
            'preco_medio' => 50.00,
            'endereco'    => 'Rua Teste, 1',
            'cidade'      => 'Rio de Janeiro',
            'estado'      => 'RJ',
            'latitude'    => -22.9519,
            'longitude'   => -43.2105,
            'status'      => 'ativo',
        ], $attrs));
    }

    public function test_listar_restaurantes(): void
    {
        $this->criarRestaurante(['nome' => 'Rest 1']);
        $this->criarRestaurante(['nome' => 'Rest 2']);

        $response = $this->getJson('/api/v1/restaurantes');

        $response->assertOk()
            ->assertJsonPath('success', true)
            ->assertJsonCount(2, 'data.data');
    }

    public function test_filtrar_por_tipo_comida(): void
    {
        $this->criarRestaurante(['tipo_comida' => 'japonesa']);
        $this->criarRestaurante(['tipo_comida' => 'italiana']);

        $response = $this->getJson('/api/v1/restaurantes?tipo_comida=japonesa');

        $response->assertOk()
            ->assertJsonCount(1, 'data.data');
    }

    public function test_proximos_restaurantes(): void
    {
        $this->criarRestaurante(['nome' => 'Perto', 'latitude' => -22.9516, 'longitude' => -43.1817]);
        $this->criarRestaurante(['nome' => 'Longe', 'latitude' => -23.5874, 'longitude' => -46.6576]);

        $response = $this->getJson('/api/v1/restaurantes/proximos?lat=-22.9519&lng=-43.2105&raio=10');

        $response->assertOk()
            ->assertJsonCount(1, 'data.data')
            ->assertJsonPath('data.data.0.nome', 'Perto');
    }

    public function test_detalhe_restaurante(): void
    {
        $rest = $this->criarRestaurante();

        $response = $this->getJson("/api/v1/restaurantes/{$rest->id}");

        $response->assertOk()
            ->assertJsonPath('data.nome', 'Restaurante Teste')
            ->assertJsonStructure([
                'data' => ['id', 'nome', 'tipo_comida', 'preco_medio', 'endereco',
                    'cidade', 'estado', 'latitude', 'longitude', 'status',
                    'avaliacao_media', 'total_avaliacoes', 'imagens', 'criado_em'],
            ]);
    }

    public function test_crud_restaurante(): void
    {
        $admin = User::factory()->create(['role' => 'admin']);

        // Criar
        $response = $this->actingAs($admin)->postJson('/api/v1/restaurantes', [
            'nome'        => 'Novo Rest',
            'tipo_comida' => 'japonesa',
            'preco_medio' => 80,
            'endereco'    => 'Rua Sushi, 10',
            'cidade'      => 'Rio',
            'estado'      => 'RJ',
            'latitude'    => -22.95,
            'longitude'   => -43.20,
        ]);
        $response->assertStatus(201);
        $id = $response->json('data.id');

        // Atualizar
        $this->actingAs($admin)->putJson("/api/v1/restaurantes/{$id}", ['nome' => 'Rest Atualizado'])
            ->assertOk()
            ->assertJsonPath('data.nome', 'Rest Atualizado');

        // Deletar
        $this->actingAs($admin)->deleteJson("/api/v1/restaurantes/{$id}")
            ->assertOk();

        $this->assertSoftDeleted('restaurantes', ['id' => $id]);
    }

    public function test_usuario_comum_nao_pode_criar(): void
    {
        $user = User::factory()->create(['role' => 'usuario']);

        $response = $this->actingAs($user)->postJson('/api/v1/restaurantes', [
            'nome' => 'X', 'tipo_comida' => 'brasileira', 'endereco' => 'X',
            'cidade' => 'X', 'estado' => 'RJ', 'latitude' => -22, 'longitude' => -43,
        ]);

        $response->assertStatus(403);
    }
}
