package render

import (
	"fmt"
	"html/template"
	"strings"

	"leadb2b.org/internal/api"
)

// FAQItem é uma pergunta e resposta geradas para a ficha da empresa.
type FAQItem struct {
	Question string
	Answer   string
}

// BuildEmpresaFAQ monta perguntas com respostas a partir dos dados públicos da Receita Federal.
// Não inclui e-mail, telefone nem outros contatos.
func BuildEmpresaFAQ(d *api.EstabelecimentoDetailOut, locked bool) []FAQItem {
	if d == nil {
		return nil
	}
	razao := strings.TrimSpace(d.Empresa.RazaoSocial)
	nome := EmpresaNomeExibicao(d)
	if nome == "" {
		nome = "esta empresa"
	}
	if razao == "" {
		razao = nome
	}
	cnpj := FmtCNPJ(d.CNPJ)
	cidade := strings.TrimSpace(d.Endereco.Municipio.Descricao)
	uf := strings.TrimSpace(d.Endereco.UF)
	local := cidade
	if uf != "" {
		if local != "" {
			local += ", " + uf
		} else {
			local = uf
		}
	}

	var items []FAQItem
	add := func(q, a string) {
		q = strings.TrimSpace(q)
		a = strings.TrimSpace(a)
		if q == "" || a == "" {
			return
		}
		items = append(items, FAQItem{Question: q, Answer: a})
	}

	add(
		fmt.Sprintf("Qual é o CNPJ de %s?", nome),
		fmt.Sprintf("O CNPJ deste estabelecimento é %s, conforme cadastro na Receita Federal.", cnpj),
	)
	add(
		fmt.Sprintf("Qual é a razão social do CNPJ %s?", cnpj),
		fmt.Sprintf("A razão social registrada é %s.", razao),
	)
	raiz := digitsOnly(d.Empresa.CNPJBasico)
	if len(raiz) != 8 && len(digitsOnly(d.CNPJ)) == 14 {
		raiz = digitsOnly(d.CNPJ)[:8]
	}
	if len(raiz) == 8 {
		add(
			fmt.Sprintf("Qual é o CNPJ raiz (básico) do grupo de %s?", nome),
			fmt.Sprintf("O CNPJ raiz da empresa é %s.%s.%s (8 primeiros dígitos do cadastro).",
				raiz[:2], raiz[2:5], raiz[5:8]),
		)
	}

	if HasText(d.NomeFantasia) {
		add(
			fmt.Sprintf("Qual é o nome fantasia de %s?", razao),
			fmt.Sprintf("O nome fantasia registrado é %s.", strings.TrimSpace(*d.NomeFantasia)),
		)
	} else {
		add(
			fmt.Sprintf("%s possui nome fantasia?", razao),
			"Não há nome fantasia informado para este estabelecimento no cadastro da Receita Federal.",
		)
	}

	if addr := EmpresaDisplayAddress(d); addr != "" {
		add(
			fmt.Sprintf("Qual é o endereço de %s?", nome),
			fmt.Sprintf("O endereço cadastral é %s.", addr),
		)
	}
	if local != "" {
		add(
			fmt.Sprintf("Em qual cidade e estado %s está localizada?", nome),
			fmt.Sprintf("O estabelecimento fica em %s.", local),
		)
	}
	if cep := strings.TrimSpace(d.Endereco.CEP); cep != "" {
		add(
			fmt.Sprintf("Qual é o CEP de %s?", nome),
			fmt.Sprintf("O CEP cadastrado é %s.", cep),
		)
	}
	if bairro := strings.TrimSpace(d.Endereco.Bairro); bairro != "" {
		add(
			fmt.Sprintf("Qual é o bairro do endereço de %s?", nome),
			fmt.Sprintf("O bairro cadastrado é %s.", bairro),
		)
	}
	logradouro := strings.TrimSpace(strings.TrimSpace(d.Endereco.TipoLogradouro + " " + d.Endereco.Logradouro))
	if logradouro != "" {
		num := strings.TrimSpace(d.Endereco.Numero)
		resp := logradouro
		if num != "" {
			resp += ", " + num
		}
		if HasText(d.Endereco.Complemento) {
			resp += " — " + strings.TrimSpace(*d.Endereco.Complemento)
		}
		add(
			fmt.Sprintf("Qual é o logradouro de %s?", nome),
			fmt.Sprintf("O logradouro cadastrado é %s.", resp),
		)
	}

	if sit := strings.TrimSpace(d.SituacaoCadastralDescricao); sit != "" {
		add(
			fmt.Sprintf("Qual é a situação cadastral de %s?", nome),
			fmt.Sprintf("A situação cadastral é %s.", sit),
		)
	}
	if ds := strings.TrimSpace(d.DataSituacaoCadastralFormatada); ds != "" && ds != "—" {
		add(
			fmt.Sprintf("Desde quando %s está com a situação cadastral atual?", nome),
			fmt.Sprintf("A data da situação cadastral registrada é %s.", ds),
		)
	}

	dataInicio, tempo := dataAtividadeParts(d)
	if dataInicio != "" && dataInicio != "—" {
		add(
			fmt.Sprintf("Quando %s iniciou suas atividades?", nome),
			fmt.Sprintf("A data de início das atividades é %s.", dataInicio),
		)
	}
	if tempo != "" {
		add(
			fmt.Sprintf("Há quanto tempo %s está em atividade?", nome),
			fmt.Sprintf("Com base na data de início das atividades, o estabelecimento está em operação há %s.", tempo),
		)
	}

	tipo := strings.TrimSpace(d.IdentificadorMatrizFilialDescricao)
	if tipo == "" {
		tipo = strings.TrimSpace(d.TipoUnidade)
	}
	if tipo != "" {
		add(
			fmt.Sprintf("%s é matriz ou filial?", nome),
			fmt.Sprintf("Este cadastro consta como %s.", tipo),
		)
	}

	principal := d.CNAE.Principal
	if desc := strings.TrimSpace(principal.Descricao); desc != "" {
		ans := desc
		if code := strings.TrimSpace(principal.Codigo); code != "" {
			ans = fmt.Sprintf("%s (CNAE %s)", desc, formatCNAECode(code))
		}
		add(
			fmt.Sprintf("Qual é o CNAE principal de %s?", nome),
			ans,
		)
	}

	sec := d.CNAE.Secundarios
	if len(sec) > 0 {
		var parts []string
		for i, c := range sec {
			if i >= 5 {
				parts = append(parts, fmt.Sprintf("e mais %d atividade(s) secundária(s)", len(sec)-5))
				break
			}
			line := strings.TrimSpace(c.Descricao)
			if code := strings.TrimSpace(c.Codigo); code != "" {
				line = fmt.Sprintf("%s (CNAE %s)", line, formatCNAECode(code))
			}
			if line != "" {
				parts = append(parts, line)
			}
		}
		if len(parts) > 0 {
			add(
				fmt.Sprintf("Quais são as atividades econômicas secundárias de %s?", nome),
				strings.Join(parts, "; ")+".",
			)
		}
	} else {
		add(
			fmt.Sprintf("%s possui CNAE secundário?", nome),
			"Não há atividades econômicas secundárias registradas para este estabelecimento.",
		)
	}

	if nj := strings.TrimSpace(d.Empresa.NaturezaJuridicaDescricao); nj != "" {
		add(
			fmt.Sprintf("Qual é a natureza jurídica de %s?", nome),
			fmt.Sprintf("A natureza jurídica é %s.", nj),
		)
	}

	if porte := formatPorte(d.Empresa.PorteEmpresa); porte != "" {
		add(
			fmt.Sprintf("Qual é o porte da empresa %s?", nome),
			fmt.Sprintf("O porte registrado é %s.", porte),
		)
	}

	if !locked {
		if cap := strings.TrimSpace(d.Empresa.CapitalSocial); cap != "" && cap != "0" && cap != "0.00" {
			add(
				fmt.Sprintf("Qual é o capital social de %s?", nome),
				fmt.Sprintf("O capital social registrado é %s.", FormatCapital(cap)),
			)
		}
		if nomes := SociosNomes(d.Socios); nomes != "" {
			add(
				fmt.Sprintf("Quem são os sócios de %s?", nome),
				fmt.Sprintf("Os sócios registrados são: %s.", nomes),
			)
		}
	}

	return items
}

func formatCNAECode(code string) string {
	d := digitsOnly(code)
	if len(d) == 7 {
		return fmt.Sprintf("%s-%s/%s", d[:4], d[4:5], d[5:7])
	}
	return code
}

func formatPorte(v any) string {
	if v == nil {
		return ""
	}
	switch x := v.(type) {
	case string:
		s := strings.TrimSpace(x)
		if s == "" || s == "0" {
			return ""
		}
		return porteLabel(s)
	default:
		s := strings.TrimSpace(fmt.Sprint(v))
		if s == "" || s == "0" || s == "<nil>" {
			return ""
		}
		return porteLabel(s)
	}
}

func porteLabel(code string) string {
	switch code {
	case "1", "01":
		return "Microempresa (ME)"
	case "2", "02":
		return "Empresa de pequeno porte (EPP)"
	case "3", "03":
		return "Demais (médio/grande porte)"
	case "5", "05":
		return "Demais"
	default:
		if len(code) > 2 {
			return code
		}
		return "código " + code
	}
}

// EmpresaStructuredData retorna JSON-LD com Organization e FAQPage para SEO.
func EmpresaStructuredData(d *api.EstabelecimentoDetailOut, siteURL string, locked bool) template.HTML {
	return EmpresaPageStructuredData(d, siteURL, locked)
}
