package web

import (
	"bytes"
	"io/fs"
	"strings"
	"testing"
)

func TestAssetsEmbedded(t *testing.T) {
	files := []string{
		"templates/layouts/base.html",
		"templates/pages/home.html",
		"templates/partials/header.html",
		"static/vendor/htmx.min.js",
		"static/vendor/vue.global.prod.js",
		"static/vendor/bootstrap/css/bootstrap.min.css",
		"static/vendor/bootstrap-icons/bootstrap-icons.min.css",
		"static/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2",
		"static/css/app.css",
		"static/js/app.js",
		"i18n/ms.json",
		"i18n/en.json",
	}
	for _, f := range files {
		if _, err := Assets.Open(f); err != nil {
			t.Errorf("missing embedded file %s: %v", f, err)
		}
	}
}

func TestRenderHome(t *testing.T) {
	v, err := NewView(nil)
	if err != nil {
		t.Fatal(err)
	}

	var buf bytes.Buffer
	data := Data{Lang: "ms", Title: "Test"}
	if err := v.Render(&buf, 200, "home", data); err != nil {
		t.Fatal(err)
	}

	html := buf.String()
	for _, want := range []string{
		"/static/vendor/htmx.min.js",
		"/static/vendor/vue.global.prod.js",
		"/static/vendor/bootstrap/js/bootstrap.bundle.min.js",
		"role-card",
		"hx-get=\"/api/ping\"",
		"lang=\"ms\"",
	} {
		if !strings.Contains(html, want) {
			t.Errorf("home html missing %q", want)
		}
	}
}

func TestHasPage(t *testing.T) {
	v, err := NewView(nil)
	if err != nil {
		t.Fatal(err)
	}
	if !v.HasPage("home") {
		t.Error("home page should exist")
	}
	if v.HasPage("does-not-exist") {
		t.Error("unexpected page exists")
	}
}

func TestStaticFS(t *testing.T) {
	sub, err := StaticFS()
	if err != nil {
		t.Fatal(err)
	}
	if _, err := fs.Stat(sub, "vendor/htmx.min.js"); err != nil {
		t.Fatalf("static sub fs missing vendor/htmx.min.js: %v", err)
	}
}
