package infra

import (
	"strings"
	"testing"
)

func TestFileUniqueName(t *testing.T) {
	t.Run("preserva extension comun como png", func(t *testing.T) {
		got := FileUniqueName("foto.png")
		if !strings.HasSuffix(got, ".png") {
			t.Fatalf("got %q, want suffix .png", got)
		}
		if len(got) < 36+4 { // uuid + ".png"
			t.Fatalf("got %q, want UUID + .png", got)
		}
	})

	t.Run("convierte extension a minusculas", func(t *testing.T) {
		got := FileUniqueName("VACACIONES.JPEG")
		if !strings.HasSuffix(got, ".jpeg") {
			t.Fatalf("got %q, want suffix .jpeg", got)
		}
	})

	t.Run("remueve caracteres especiales en extension", func(t *testing.T) {
		got := FileUniqueName("malicious.t!x@t#")
		if !strings.HasSuffix(got, ".txt") {
			t.Fatalf("got %q, want suffix .txt", got)
		}
	})

	t.Run("genera UUID sin extension si el archivo no tiene", func(t *testing.T) {
		got := FileUniqueName("contrato_sin_extension")
		if strings.Contains(got, ".") {
			t.Fatalf("got %q, want sin punto", got)
		}
		if len(got) != 36 {
			t.Fatalf("got %q (len %d), want UUID len 36", got, len(got))
		}
	})

	t.Run("trunca extensiones extremadamente largas", func(t *testing.T) {
		got := FileUniqueName("file." + strings.Repeat("a", 100))
		// Buscar la ultima parte despues del punto
		idx := strings.LastIndex(got, ".")
		if idx < 0 {
			t.Fatalf("got %q, want al menos un punto", got)
		}
		ext := got[idx+1:]
		if len(ext) > 16 {
			t.Fatalf("got ext len %d, want <= 16", len(ext))
		}
	})

	t.Run("dos llamadas generan IDs distintos", func(t *testing.T) {
		a := FileUniqueName("x.png")
		b := FileUniqueName("x.png")
		if a == b {
			t.Fatalf("got %q == %q, want distintos", a, b)
		}
	})
}
