<?php

namespace Tests\Feature\Monitoring;

use App\Support\TextoSencillo;
use Tests\TestCase;

/**
 * Las negritas y los párrafos de los avisos de las modales.
 *
 * **Lo que se rompía.** Los mensajes se escriben con `**negrita**` y dos saltos entre ideas
 * —nueve mensajes del panel ya lo hacían— y la vista los pintaba con `{{ $message }}`: los
 * asteriscos salían literales y los saltos se comían. Un aviso de cuatro ideas se leía como
 * un párrafo de cinco líneas seguidas, y en una modal de borrado eso es un texto que nadie
 * lee.
 *
 * **Y lo que no puede volver.** El marcado se añade *después* de escapar. Al revés sería una
 * inyección de HTML por un texto que escribe el propio panel hoy, pero que mañana podría
 * llevar dentro el nombre de algo que escribió un cliente.
 */
class TextoDeLasModalesTest extends TestCase
{
    public function test_las_negritas_se_pintan(): void
    {
        $html = (string) TextoSencillo::aHtml('Se borran **2 episodios**.');

        $this->assertStringContainsString('<strong class="font-semibold">2 episodios</strong>', $html);
        $this->assertStringNotContainsString('**', $html);
    }

    public function test_dos_saltos_son_dos_parrafos(): void
    {
        $html = (string) TextoSencillo::aHtml("Primera idea.\n\nSegunda idea.");

        $this->assertSame(2, substr_count($html, '<p '), 'Cada idea, su párrafo.');
    }

    public function test_un_salto_suelto_es_un_salto_dentro_del_parrafo(): void
    {
        $html = (string) TextoSencillo::aHtml("Una línea.\nY otra.");

        $this->assertSame(1, substr_count($html, '<p '));
        $this->assertStringContainsString('<br>', $html);
    }

    public function test_el_html_que_venga_en_el_texto_sale_escapado(): void
    {
        // **El orden importa y es lo único que hace esto seguro**: se escapa primero y se
        // marca después. Al revés, un mensaje con HTML dentro se ejecutaría.
        $html = (string) TextoSencillo::aHtml('<script>alert(1)</script>');

        $this->assertStringNotContainsString('<script>', $html);
        $this->assertStringContainsString('&lt;script&gt;', $html);
    }

    public function test_un_asterisco_suelto_no_pone_media_pantalla_en_negrita(): void
    {
        $html = (string) TextoSencillo::aHtml('Esto ** no cierra y sigue');

        $this->assertStringNotContainsString('<strong', $html);
    }

    public function test_una_negrita_no_cruza_de_linea(): void
    {
        // Un asterisco olvidado en una línea no debe arrastrar la siguiente.
        $html = (string) TextoSencillo::aHtml("Primera **sin cerrar\nSegunda** línea");

        $this->assertStringNotContainsString('<strong', $html);
    }

    public function test_un_texto_vacio_no_pinta_nada(): void
    {
        $this->assertSame('', (string) TextoSencillo::aHtml(''));
        $this->assertSame('', (string) TextoSencillo::aHtml(null));
    }
}
