<?php

declare(strict_types=1);

namespace Tests\Feature;

use App\Filament\Resources\Leads\Pages\ListLeads;
use App\Models\Lead;
use App\Models\User;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Livewire\Livewire;
use PHPUnit\Framework\Attributes\Test;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

/**
 * Captura de leads del bot de ventas de la landing + su recurso en el panel.
 */
class LeadCaptureTest extends TestCase
{
    use DatabaseTransactions;

    #[Test]
    public function the_sales_bot_captures_a_lead(): void
    {
        $this->postJson('/leads', [
            'name' => 'Ana Prospecto',
            'email' => 'ana@ejemplo.com',
            'phone' => '300 123 4567',
            'message' => 'Quiero información',
        ])->assertCreated()->assertJsonStructure(['message']);

        $this->assertDatabaseHas('leads', [
            'name' => 'Ana Prospecto',
            'email' => 'ana@ejemplo.com',
            'phone' => '300 123 4567',
            'source' => 'sales_bot',
            'status' => Lead::STATUS_NEW,
        ]);
    }

    #[Test]
    public function a_lead_requires_name_email_and_phone(): void
    {
        $this->postJson('/leads', ['name' => ''])
            ->assertStatus(422)
            ->assertJsonValidationErrors(['name', 'email', 'phone']);
    }

    #[Test]
    public function it_rejects_a_malformed_phone_and_an_invalid_email(): void
    {
        $this->postJson('/leads', [
            'name' => 'Ana',
            'email' => 'no-es-correo',
            'phone' => '<script>alert(1)</script>',
        ])
            ->assertStatus(422)
            ->assertJsonValidationErrors(['email', 'phone']);

        // Se asevera SOLO sobre el lead de este test: contar la tabla completa
        // fallaba en cuanto la BD tuviera leads de otras corridas o de datos reales.
        $this->assertDatabaseMissing('leads', ['name' => 'Ana', 'email' => 'no-es-correo']);
    }

    #[Test]
    public function it_rejects_angle_brackets_in_the_name(): void
    {
        $this->postJson('/leads', [
            'name' => '<img src=x onerror=alert(1)>',
            'email' => 'ana@ejemplo.com',
            'phone' => '3001234567',
        ])
            ->assertStatus(422)
            ->assertJsonValidationErrors(['name']);
    }

    #[Test]
    public function super_admin_can_list_leads_in_the_panel(): void
    {
        Role::firstOrCreate(['name' => 'super_admin', 'guard_name' => 'web']);
        $super = User::factory()->create(['company_id' => null]);
        $super->assignRole('super_admin');
        $this->actingAs($super);
        Filament::setCurrentPanel(Filament::getDefaultPanel());

        $lead = Lead::create(['name' => 'Beto Prospecto', 'phone' => '3007654321']);

        Livewire::test(ListLeads::class)
            ->assertOk()
            ->assertCanSeeTableRecords([$lead]);
    }
}
