package handlers

import (
	"embed"
	"io/fs"
	"net/http"
	"strings"

	"leadb2b.org/internal/render"
)

//go:embed staticpages/*.html
var staticPages embed.FS

type StaticHandler struct {
	pages   map[string][]byte
	siteURL string
}

func NewStaticHandler(siteURL string) (*StaticHandler, error) {
	h := &StaticHandler{pages: make(map[string][]byte), siteURL: siteURL}
	err := fs.WalkDir(staticPages, "staticpages", func(path string, d fs.DirEntry, err error) error {
		if err != nil || d.IsDir() {
			return err
		}
		name := strings.TrimSuffix(strings.TrimPrefix(path, "staticpages/"), ".html")
		data, err := staticPages.ReadFile(path)
		if err != nil {
			return err
		}
		h.pages[name] = []byte(rewriteStaticHTML(string(data)))
		return nil
	})
	return h, err
}

func (h *StaticHandler) Serve(name string) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		data, ok := h.pages[name]
		if !ok {
			http.NotFound(w, r)
			return
		}
		meta := render.StaticPageMetaForName(name, h.siteURL)
		html := render.InjectPageMeta(string(data), meta)
		if summary := staticGeoSummary(name); summary != "" {
			html = injectStaticGeoSummary(html, summary)
		}
		html = strings.Replace(html, "</head>", render.GEOMonitorHTMLComment()+"\n</head>", 1)
		html = ApplySiteEnhancements(html)
		w.Header().Set("Content-Type", "text/html; charset=utf-8")
		w.Header().Set("Cache-Control", "public, max-age=3600")
		w.Write([]byte(html))
	}
}

func rewriteStaticHTML(html string) string {
	return RewriteSiteHTML(html)
}

func staticGeoSummary(name string) string {
	meta := render.StaticPageMetaForName(name, "https://leadb2b.org")
	if meta.NoIndex || meta.Description == "" {
		return ""
	}
	return "<strong>LeadB2B</strong> — " + meta.Description
}

func injectStaticGeoSummary(html, summary string) string {
	block := `<section class="geo-summary sr-only-focusable" aria-label="Resumo"><p class="m-b0">` + summary + `</p></section>`
	// Após o hero — nunca antes, para não quebrar o topo igual ao /busca.
	for _, marker := range []string{
		`<!-- INNER PAGE BANNER END -->`,
		`<!-- Banner End-->`,
	} {
		if strings.Contains(html, marker) {
			return strings.Replace(html, marker, marker+"\n"+block, 1)
		}
	}
	return html
}
