package web

import (
	"regexp"
	"strings"
	"testing"
	"unicode/utf8"
)

func TestEmbedURL(t *testing.T) {
	tests := []struct {
		name    string
		id      string
		wantURL string
		wantOK  bool
	}{
		{"valid 11-char id", "dQw4w9WgXcQ", "https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ", true},
		{"valid with dash and underscore", "a_b-cD12345", "https://www.youtube-nocookie.com/embed/a_b-cD12345", true},
		{"empty", "", "", false},
		{"too short", "abc", "", false},
		{"too long", "dQw4w9WgXcQX", "", false},
		{"invalid char", "dQw4w9WgXc!", "", false},
		{"space", "dQw4w9WgX Q", "", false},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			gotURL, gotOK := embedURL(tt.id)
			if gotURL != tt.wantURL || gotOK != tt.wantOK {
				t.Errorf("embedURL(%q) = (%q, %v), want (%q, %v)",
					tt.id, gotURL, gotOK, tt.wantURL, tt.wantOK)
			}
		})
	}
}

// TestTapirFrameRowsAligned asserts every box row has the same cell width once
// the inline-colour spans are stripped, so the rounded border lines up on every
// line (the panel only looks right if the right │ is flush across all rows).
func TestTapirFrameRowsAligned(t *testing.T) {
	stripSpan := regexp.MustCompile(`</?span[^>]*>`)
	for name, frame := range map[string]string{"f1": tapirFrameHTML1, "f2": tapirFrameHTML2, "f3": tapirFrameHTML3} {
		plain := stripSpan.ReplaceAllString(frame, "")
		want := tapirInteriorW + 2 // both purple side borders
		for i, line := range strings.Split(plain, "\n") {
			if got := utf8.RuneCountInString(line); got != want {
				t.Errorf("%s line %d width = %d, want %d: %q", name, i, got, want, line)
			}
		}
	}
}
