package render

import (
	"bytes"
	"fmt"
	"html/template"
	"sort"
	"strconv"
	"strings"

	"leadb2b.org/internal/api"
)

type CNAESectionGroup struct {
	Letter string
	Title  string
	Items  []api.CnaeItem
}

func LookupCNAEDescricao(items []api.CnaeItem, code string) string {
	code = strings.TrimSpace(code)
	if code == "" {
		return ""
	}
	for _, item := range items {
		if item.Codigo == code {
			if item.Descricao != "" {
				return item.Codigo + " — " + item.Descricao
			}
			return item.Codigo
		}
	}
	return code
}

type cnaeSectionDef struct {
	letter       string
	title        string
	minDiv, maxDiv int
}

var cnaeSectionDefs = []cnaeSectionDef{
	{"A", "Agricultura, pecuária e serviços relacionados", 1, 3},
	{"B", "Indústrias extrativas", 5, 9},
	{"C", "Indústrias de transformação", 10, 33},
	{"D", "Eletricidade e gás", 35, 35},
	{"E", "Água, esgoto e gestão de resíduos", 36, 39},
	{"F", "Construção", 41, 43},
	{"G", "Comércio e reparação de veículos", 45, 47},
	{"H", "Transporte, armazenagem e correio", 49, 53},
	{"I", "Alojamento e alimentação", 55, 56},
	{"J", "Informação e comunicação", 58, 63},
	{"K", "Atividades financeiras e seguros", 64, 66},
	{"L", "Atividades imobiliárias", 68, 68},
	{"M", "Atividades profissionais e técnicas", 69, 75},
	{"N", "Atividades administrativas e complementares", 77, 82},
	{"O", "Administração pública", 84, 84},
	{"P", "Educação", 85, 85},
	{"Q", "Saúde humana e serviços sociais", 86, 88},
	{"R", "Artes, cultura, esporte e recreação", 90, 93},
	{"S", "Outras atividades de serviços", 94, 96},
	{"T", "Serviços domésticos", 97, 97},
	{"U", "Organismos internacionais", 99, 99},
}

func divisionFromCNAECode(code string) int {
	code = strings.TrimSpace(code)
	if len(code) < 2 {
		return 0
	}
	n, _ := strconv.Atoi(code[:2])
	return n
}

func cnaeSectionLetter(division int) string {
	for _, s := range cnaeSectionDefs {
		if division >= s.minDiv && division <= s.maxDiv {
			return s.letter
		}
	}
	return "U"
}

func cnaeSectionTitle(letter string) string {
	for _, s := range cnaeSectionDefs {
		if s.letter == letter {
			return s.title
		}
	}
	return "Outros"
}

// BuscaCNAEURL monta link para listagem de empresas ativas com o CNAE informado.
func BuscaCNAEURL(code string) string {
	code = strings.TrimSpace(code)
	if code == "" {
		return "/busca?situacao_cadastral=2"
	}
	return "/busca?cnae_fiscal_principal=" + template.URLQueryEscaper(code) + "&situacao_cadastral=2"
}

// GroupCNAEsBySection organiza os CNAEs da API por seção oficial (A–U).
func GroupCNAEsBySection(items []api.CnaeItem) []CNAESectionGroup {
	byLetter := make(map[string][]api.CnaeItem, len(cnaeSectionDefs))
	for _, item := range items {
		code := strings.TrimSpace(item.Codigo)
		if code == "" {
			continue
		}
		letter := cnaeSectionLetter(divisionFromCNAECode(code))
		byLetter[letter] = append(byLetter[letter], api.CnaeItem{
			Codigo:    code,
			Descricao: strings.TrimSpace(item.Descricao),
		})
	}

	groups := make([]CNAESectionGroup, 0, len(cnaeSectionDefs))
	for _, def := range cnaeSectionDefs {
		list := byLetter[def.letter]
		if len(list) == 0 {
			continue
		}
		sort.Slice(list, func(i, j int) bool {
			if list[i].Descricao == list[j].Descricao {
				return list[i].Codigo < list[j].Codigo
			}
			return list[i].Descricao < list[j].Descricao
		})
		groups = append(groups, CNAESectionGroup{
			Letter: def.letter,
			Title:  def.title,
			Items:  list,
		})
	}
	return groups
}

const cnaeCatalogHTMLTmpl = `<section class="section-full p-t120 p-b90 site-bg-gray leadb2b-cnae-catalog" id="segmentos-cnae">
<div class="container">
<div class="section-head center wt-small-separator-outer">
<div class="wt-small-separator site-text-primary"><div>Segmentos</div></div>
<h2 class="wt-title">Busque empresas por CNAE</h2>
<p class="m-b0">Escolha um segmento para ver <strong>empresas ativas</strong> naquele CNAE.</p>
</div>
<div class="leadb2b-cnae-catalog__toolbar">
<input type="search" class="form-control leadb2b-cnae-catalog__search" id="cnae-catalog-search" placeholder="Filtrar segmento ou código CNAE…" autocomplete="off" aria-label="Filtrar segmentos CNAE">
</div>
<div class="leadb2b-cnae-catalog__sections" id="cnae-catalog-sections">
{{range .Groups}}
<details class="leadb2b-cnae-section">
<summary class="leadb2b-cnae-section__summary">
<span class="leadb2b-cnae-section__letter">{{.Letter}}</span>
<span class="leadb2b-cnae-section__title">{{.Title}}</span>
</summary>
<ul class="leadb2b-cnae-list">
{{range .Items}}
<li class="leadb2b-cnae-list__item" data-search="{{.Codigo}} {{.Descricao}}">
<a href="{{buscaCNAE .Codigo}}" class="leadb2b-cnae-list__link">
<span class="leadb2b-cnae-list__code">{{.Codigo}}</span>
<span class="leadb2b-cnae-list__desc">{{.Descricao}}</span>
</a>
</li>
{{end}}
</ul>
</details>
{{end}}
</div>
<p class="leadb2b-cnae-catalog__empty text-muted" id="cnae-catalog-empty" hidden>Nenhum segmento encontrado para este filtro.</p>
</div>
</section>`

type cnaeCatalogData struct {
	Groups []CNAESectionGroup
}

// CNAECatalogHTML renderiza o bloco de categorias CNAE para a home.
func CNAECatalogHTML(groups []CNAESectionGroup) (string, error) {
	tmpl, err := template.New("cnae_catalog").Funcs(template.FuncMap{
		"buscaCNAE": BuscaCNAEURL,
	}).Parse(cnaeCatalogHTMLTmpl)
	if err != nil {
		return "", fmt.Errorf("parse cnae catalog: %w", err)
	}
	var buf bytes.Buffer
	if err := tmpl.Execute(&buf, cnaeCatalogData{
		Groups: groups,
	}); err != nil {
		return "", fmt.Errorf("execute cnae catalog: %w", err)
	}
	return buf.String(), nil
}
