package services

import (
	"strings"
	"testing"
)

func TestFormatearParaTelegram(t *testing.T) {
	cases := []struct {
		name            string
		in              string
		wantContains    []string
		wantNotContains []string
	}{
		{
			name:            "encabezado y negrita",
			in:              "## ✅ **¡Factura registrada exitosamente!**",
			wantContains:    []string{"<b>✅ ¡Factura registrada exitosamente!</b>"},
			wantNotContains: []string{"##", "**"},
		},
		{
			name:            "lista con viñetas y negrita en cada línea",
			in:              "- **Factura ID:** 3\n- **Cliente:** DOCUXER S.A.S.",
			wantContains:    []string{"• <b>Factura ID:</b> 3", "• <b>Cliente:</b> DOCUXER S.A.S."},
			wantNotContains: []string{"- **"},
		},
		{
			name:            "separador horizontal se elimina",
			in:              "Texto antes\n---\nTexto después",
			wantContains:    []string{"Texto antes", "Texto después"},
			wantNotContains: []string{"---"},
		},
		{
			name:         "caracteres HTML literales se escapan",
			in:           "El monto es < 1000 y > 500 & sigue",
			wantContains: []string{"&lt; 1000", "&gt; 500", "&amp; sigue"},
		},
		{
			name:         "código en línea se preserva sin escapar dos veces",
			in:           "Usa el comando `git status` para ver el estado",
			wantContains: []string{"<code>git status</code>"},
		},
		{
			name:         "bloque de código se convierte a pre",
			in:           "```\nfunc main() {}\n```",
			wantContains: []string{"<pre>func main() {}</pre>"},
		},
		{
			name:         "enlace markdown",
			in:           "Mira [este link](https://u-site.app)",
			wantContains: []string{`<a href="https://u-site.app">este link</a>`},
		},
	}

	for _, c := range cases {
		t.Run(c.name, func(t *testing.T) {
			got := FormatearParaTelegram(c.in)
			for _, want := range c.wantContains {
				if !strings.Contains(got, want) {
					t.Errorf("esperaba que el resultado contuviera %q\nresultado: %q", want, got)
				}
			}
			for _, notWant := range c.wantNotContains {
				if strings.Contains(got, notWant) {
					t.Errorf("no esperaba que el resultado contuviera %q\nresultado: %q", notWant, got)
				}
			}
		})
	}
}
