package handlers

import (
	"regexp"
	"strings"
)

const leadb2bHomeLogo = `<img src="images/logo-white.png" alt="LeadB2B" class="default-scroll-show"><img src="images/logo-dark.png" alt="LeadB2B" class="on-scroll-show">`

// RewriteSiteHTML adapta HTML do protótipo site/ para rotas e assets do Go.
func RewriteSiteHTML(html string) string {
	replacements := []struct{ old, new string }{
		{`src="images/logo-light-3.png"`, `src="images/logo-white.png"`},
		{`src="images/logo-light.png"`, `src="images/logo-white.png"`},
		{`src="images/logo-light-2.png"`, `src="images/logo-white.png"`},
		{`<img src="images/logo-dark.png" alt="">`, leadb2bHomeLogo},
		{`href="css/`, `href="/static/css/`},
		{`src="css/`, `src="/static/css/`},
		{`href="js/`, `href="/static/js/`},
		{`src="js/`, `src="/static/js/`},
		{`src="/static/js/custom.js"`, `src="/static/js/custom.js?v=10"`},
		{`src="js/custom.js"`, `src="/static/js/custom.js?v=10"`},
		{`href="css/leadb2b.css?v=10"`, `href="/static/css/leadb2b.css?v=32"`},
		{`href="css/leadb2b.css?v=12"`, `href="/static/css/leadb2b.css?v=32"`},
		{`href="css/leadb2b.css"`, `href="/static/css/leadb2b.css?v=32"`},
		{`href="/static/css/leadb2b.css?v=14"`, `href="/static/css/leadb2b.css?v=32"`},
		{`href="/static/css/leadb2b.css?v=19"`, `href="/static/css/leadb2b.css?v=32"`},
		{`href="/static/css/leadb2b.css?v=20"`, `href="/static/css/leadb2b.css?v=32"`},
		{`href="/static/css/leadb2b.css?v=21"`, `href="/static/css/leadb2b.css?v=32"`},
		{`href="/static/css/leadb2b.css?v=23"`, `href="/static/css/leadb2b.css?v=32"`},
		{`<div class="wt-bnr-inr overlay-wraper`, `<div class="wt-bnr-inr leadb2b-page-hero overlay-wraper`},
		{`<div class="overlay-main site-bg-white opacity-01"></div>`, `<div class="overlay-main leadb2b-page-hero__overlay"></div>`},
		{`src="js/search-filters.js?v=7"`, `src="/static/js/search-filters.js?v=10"`},
		{`src="js/search-filters.js?v=9"`, `src="/static/js/search-filters.js?v=10"`},
		{`src="js/search-filters.js?v=13"`, `src="/static/js/search-filters.js?v=14"`},
		{`src="js/search-filters.js?v=10"`, `src="/static/js/search-filters.js?v=14"`},
		{`src="js/cnae-catalog.js?v=1"`, `src="/static/js/cnae-catalog.js?v=2"`},
		{`src="js/cnae-catalog.js?v=2"`, `src="/static/js/cnae-catalog.js?v=2"`},
		{`href="fonts/`, `href="/static/fonts/`},
		{`src="fonts/`, `src="/static/fonts/`},
		{`href="images/`, `href="/static/images/`},
		{`src="images/`, `src="/static/images/`},
		{`url(images/`, `url(/static/images/`},
		{`href="index.html"`, `href="/"`},
		{`href="resultados.html"`, `href="/busca"`},
		{`href="busca-avancada.html"`, `href="/busca"`},
		{`href="empresa.html"`, `href="/busca"`},
		{`href="empresa-premium.html"`, `href="/busca"`},
		{`href="pricing.html"`, `href="/pricing"`},
		{`href="faq.html"`, `href="/faq"`},
		{`href="contact.html"`, `href="/contact"`},
		{`href="termos.html"`, `href="/termos"`},
		{`href="privacidade.html"`, `href="/privacidade"`},
		{`href="login.html"`, `href="/login"`},
		{`href="cadastro.html"`, `href="/cadastro"`},
		{`href="blog.html"`, `href="/blog"`},
		{`href="blog-como-encontrar-leads-b2b.html"`, `href="/blog/como-encontrar-leads-b2b"`},
		{`href="blog-segmentacao-por-cnae.html"`, `href="/blog/segmentacao-por-cnae"`},
		{`href="blog-exportar-lista-empresas-crm.html"`, `href="/blog/exportar-lista-empresas-crm"`},
		{`href="blog-estrategias-prospeccao-ativa.html"`, `href="/blog/estrategias-prospeccao-ativa"`},
		{`href="sobre-dados.html"`, `href="/sobre-dados"`},
		{`background-image:url(images/banner/1.jpg)`, `background-image:url(images/home-3/banner1.jpg)`},
		{`background-image:url(/static/images/banner/1.jpg)`, `background-image:url(/static/images/home-3/banner1.jpg)`},
		{`<li><a href="index.html">Home</a></li>`, `<li><a href="/">Início</a></li>`},
		{`<li><a href="/">Home</a></li>`, `<li><a href="/">Início</a></li>`},
		{`action="resultados.html"`, `action="/busca"`},
		{`header-style-3`, `header-style-light`},
		{`site-header header-style-light mobile-sider-drawer-menu`, `site-header header-style-light mobile-sider-drawer-menu leadb2b-header`},
	}
	for _, r := range replacements {
		html = strings.ReplaceAll(html, r.old, r.new)
	}
	if !strings.Contains(html, "leadb2b.css") {
		const inject = `<link rel="stylesheet" type="text/css" href="/static/css/leadb2b.css?v=32">`
		if strings.Contains(html, `href="/static/css/style.css"><!-- MAIN STYLE SHEET -->`) {
			html = strings.Replace(html,
				`href="/static/css/style.css"><!-- MAIN STYLE SHEET -->`,
				`href="/static/css/style.css"><!-- MAIN STYLE SHEET -->
    `+inject,
				1,
			)
		} else {
			html = strings.Replace(html,
				`<link rel="stylesheet" type="text/css" href="/static/css/style.css">`,
				`<link rel="stylesheet" type="text/css" href="/static/css/style.css">
    `+inject,
				1,
			)
		}
	}
	dashboardLinks := []string{
		`<li><a href="dashboard.html">Painel</a></li>`,
		`<li><a href="/dashboard">Painel</a></li>`,
		`<li><a href="dash-exportacoes.html">Exportações</a></li>`,
		`<li><a href="/dash-exportacoes">Exportações</a></li>`,
		`<li><a href="dash-favoritos.html">Favoritos</a></li>`,
		`<li><a href="dash-pacote.html">Pacote</a></li>`,
		`<li><a href="dash-perfil.html">Perfil</a></li>`,
		`<li><a href="dash-senha.html">Senha</a></li>`,
		`<li><a href="dash-transacoes.html">Transações</a></li>`,
	}
	for _, l := range dashboardLinks {
		html = strings.ReplaceAll(html, l, "")
	}
	html = fixMobileNavToggler(html)
	return stripStyleSwitcher(html)
}

func fixMobileNavToggler(html string) string {
	const toggler = `<button id="mobile-side-drawer" data-target=".header-nav" data-toggle="collapse" type="button" class="navbar-toggler collapsed">`
	const togglerA11y = `<button id="mobile-side-drawer" data-target=".header-nav" data-toggle="collapse" type="button" class="navbar-toggler collapsed" aria-label="Abrir menu">`
	html = strings.ReplaceAll(html, toggler, togglerA11y)
	html = strings.ReplaceAll(html, `<span class="sr-only">Toggle navigation</span>`, "")
	return html
}

var (
	switcherCSSLink = regexp.MustCompile(`(?m)^[ \t]*<link[^>]*switcher\.css[^>]*>\s*\n?`)
	switcherJS      = regexp.MustCompile(`(?m)^[ \t]*<script[^>]*switcher\.js[^>]*></script>[^\n]*\n?`)
	switcherBlock   = regexp.MustCompile(`(?s)<!-- STYLE SWITCHER.*?<!-- STYLE SWITCHER END[^>]*-->\s*`)
)

func stripStyleSwitcher(html string) string {
	html = strings.ReplaceAll(html, "<!-- SIDE SWITCHER STYLE SHEET -->\r\n", "")
	html = strings.ReplaceAll(html, "<!-- SIDE SWITCHER STYLE SHEET -->\n", "")
	html = switcherCSSLink.ReplaceAllString(html, "")
	html = switcherJS.ReplaceAllString(html, "")
	html = switcherBlock.ReplaceAllString(html, "")
	return html
}

// ApplySiteEnhancements aplica melhorias de a11y, GEO e performance em HTML embarcado.
func ApplySiteEnhancements(html string) string {
	html = injectSkipLink(html)
	html = wrapPageContentMain(html)
	html = injectContentCTABanner(html)
	html = injectPasswordToggleScript(html)
	html = enhanceNavAria(html)
	html = enhanceScrollTop(html)
	html = deferNonCriticalScripts(html)
	html = removeBlogFakePagination(html)
	html = removeJobzillaModals(html)
	html = fixEmptyAlts(html)
	return html
}

var jobzillaModalBlock = regexp.MustCompile(`(?s)<!--Model Popup Section Start-->.*?<!--Model Popup Section End-->\s*`)

func removeJobzillaModals(html string) string {
	return jobzillaModalBlock.ReplaceAllString(html, "")
}

const contentCTABanner = `<section class="leadb2b-content-cta" aria-label="Convite para cadastro">
    <div class="container text-center">
        <h2 class="leadb2b-content-cta__title">Aumente suas vendas com Prospecção Ativa</h2>
        <p class="leadb2b-content-cta__sub">Organize seu funil, trabalhe leads todos os dias e feche mais clientes.</p>
        <a href="/cadastro" class="site-button leadb2b-content-cta__btn">Crie sua conta grátis</a>
    </div>
</section>`

func injectPasswordToggleScript(html string) string {
	const tag = `<script src="/static/js/password-toggle.js?v=1" defer></script>`
	if strings.Contains(html, "password-toggle.js") {
		return html
	}
	if strings.Contains(html, "</body>") {
		return strings.Replace(html, "</body>", tag+"\n</body>", 1)
	}
	return html
}

func injectContentCTABanner(html string) string {
	if strings.Contains(html, "leadb2b-content-cta") || strings.Contains(html, "twm-home3-banner-section") {
		return html
	}
	const beforeFooter = `<!-- FOOTER START -->`
	if strings.Contains(html, beforeFooter) {
		return strings.Replace(html, beforeFooter, contentCTABanner+"\n\n        "+beforeFooter, 1)
	}
	return html
}

func injectSkipLink(html string) string {
	if strings.Contains(html, "leadb2b-skip-link") {
		return html
	}
	const marker = "<body>"
	const skip = `<body>
    <a class="leadb2b-skip-link" href="#main-content">Ir para o conteúdo</a>`
	if strings.Contains(html, marker) {
		return strings.Replace(html, marker, skip, 1)
	}
	return html
}

func wrapPageContentMain(html string) string {
	if strings.Contains(html, `id="main-content"`) {
		return html
	}
	html = strings.Replace(html, `<div class="page-content">`, `<main id="main-content" class="page-content">`, 1)
	html = strings.Replace(html, `</div>
        <!-- CONTENT END -->`, `</main>
        <!-- CONTENT END -->`, 1)
	html = strings.Replace(html, `</div><!-- CONTENT END -->`, `</main><!-- CONTENT END -->`, 1)
	return html
}

func enhanceNavAria(html string) string {
	const navOpen = `<ul class=" nav navbar-nav">`
	const navOpenSp = `<ul class="nav navbar-nav">`
	const navLabeled = `<ul class="nav navbar-nav" role="navigation" aria-label="Principal">`
	html = strings.ReplaceAll(html, navOpen, navLabeled)
	html = strings.ReplaceAll(html, navOpenSp, navLabeled)
	return html
}

func enhanceScrollTop(html string) string {
	return strings.Replace(html,
		`<button class="scroltop">`,
		`<button class="scroltop" type="button" aria-label="Voltar ao topo">`,
		1)
}

func deferNonCriticalScripts(html string) string {
	const prefix = `<script src="/static/js/`
	var b strings.Builder
	rest := html
	for {
		i := strings.Index(rest, prefix)
		if i < 0 {
			b.WriteString(rest)
			break
		}
		b.WriteString(rest[:i])
		rest = rest[i:]
		end := strings.Index(rest, ">")
		if end < 0 {
			b.WriteString(rest)
			break
		}
		tag := rest[:end+1]
		rest = rest[end+1:]
		if strings.Contains(tag, " defer") || strings.Contains(tag, "search-filters") {
			b.WriteString(tag)
			continue
		}
		if strings.HasSuffix(tag, ">") && !strings.Contains(tag, " defer") {
			tag = strings.TrimSuffix(tag, ">") + ` defer>`
		}
		b.WriteString(tag)
	}
	return b.String()
}

func removeBlogFakePagination(html string) string {
	const block = `<div class="pagination-outer">
                                <div class="pagination-style1">
                                    <ul class="clearfix">
                                        <li class="active"><a href="blog.html">1</a></li>
                                        <li><a href="blog.html">2</a></li>
                                        <li class="next"><a href="blog.html"><span><i class="fa fa-angle-right"></i></span></a></li>
                                    </ul>
                                </div>
                            </div>`
	return strings.ReplaceAll(html, block, "")
}

func fixEmptyAlts(html string) string {
	replacements := []struct{ old, new string }{
		{`<img src="/static/images/logo-dark.png" alt="">`, `<img src="/static/images/logo-dark.png" alt="LeadB2B">`},
		{`<img src="/static/images/logo-white.png" alt="">`, `<img src="/static/images/logo-white.png" alt="LeadB2B">`},
		{`src="/static/images/blog/`, `data-blog-img="1" src="/static/images/blog/`},
	}
	for _, r := range replacements {
		html = strings.ReplaceAll(html, r.old, r.new)
	}
	// Imagens de blog sem alt
	html = strings.ReplaceAll(html, `src="/static/images/blog/recent-blog/`, `alt="Miniatura de artigo LeadB2B" src="/static/images/blog/recent-blog/`)
	return html
}
