import json, html, urllib.parse, os
import dados as D

ICONES = {
    "whatsapp": '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round" aria-hidden="true"><path d="M4 20l1.3-3.9A8 8 0 1 1 8 19z"/><path d="M9.2 8.6c.2 2.7 2.4 5 5.2 5.3l.9-1.3-1.7-.8-.7.6c-.9-.4-1.6-1.1-2-2l.6-.7-.8-1.7z" stroke-width="1.3"/></svg>',
    "telefone": '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round" aria-hidden="true"><path d="M5 4h4l1.5 4.5-2.3 1.4a11 11 0 0 0 5.9 5.9l1.4-2.3L20 15v4a1.5 1.5 0 0 1-1.6 1.5A16.5 16.5 0 0 1 3.5 5.6 1.5 1.5 0 0 1 5 4z"/></svg>',
    "email": '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3.5 6.5l8.5 6.5 8.5-6.5"/></svg>',
    "local": '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M12 21s-7-6.2-7-11.5a7 7 0 0 1 14 0C19 14.8 12 21 12 21z"/><circle cx="12" cy="9.5" r="2.5"/></svg>',
    "relogio": '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><circle cx="12" cy="12" r="8.5"/><path d="M12 7.5V12l3 2"/></svg>',
    "chamado": '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><rect x="4" y="3.5" width="16" height="17" rx="2"/><path d="M8 8h8M8 12h8M8 16h5"/></svg>',
    "menu": '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"/></svg>',
}

def no_hex(cor_no="var(--ciano-sinal)"):
    return ('<svg class="card__no" viewBox="0 0 40 40" fill="none" aria-hidden="true">'
            '<path d="M20 3l14.7 8.5v17L20 37 5.3 28.5v-17z" stroke="var(--ameixa)" stroke-width="1.5"/>'
            f'<circle cx="20" cy="20" r="4" stroke="{cor_no}" stroke-width="1.5"/></svg>')

def esc(s):
    return html.escape(s, quote=True)

def wa(msg):
    return f"https://wa.me/{D.WHATSAPP_NUM}?text=" + urllib.parse.quote(msg)

def pend(texto="a confirmar"):
    return f'<span class="pendente">[{esc(texto)}]</span>'

def endereco_txt():
    b = f" – {D.BAIRRO}" if D.BAIRRO else ""
    return f"{D.RUA}{b} – {D.CIDADE}/{D.UF} – CEP {D.CEP}"

def horario_html():
    if not D.HORARIO:
        return pend("horário a confirmar")
    return "<br>".join(f"{esc(d)}: {a} às {f}" for d, a, f in D.HORARIO)

class Ctx:
    """Resolve links: produção usa caminhos absolutos /x/; prévia usa caminhos relativos com index.html."""
    def __init__(self, modo, caminho):
        self.modo, self.caminho = modo, caminho  # caminho: "" (início) ou "empresas/suporte-de-ti/"
    def u(self, destino):
        if destino.startswith(("http", "#", "mailto:", "tel:")):
            return destino
        if self.modo == "producao":
            return "/" + destino
        prof = self.caminho.count("/")
        alvo = destino if (destino == "" or not destino.endswith("/")) else destino
        if alvo == "" or alvo.endswith("/"):
            alvo = alvo + "index.html"
        return "../" * prof + alvo

NAV = [
    ("empresas/", "Para empresas"),
    ("assistencia-tecnica/", "Assistência técnica"),
    ("loja/", "Loja e impressões"),
    ("sobre/", "Sobre"),
    ("conteudos/", "Conteúdos"),
    ("contato/", "Contato"),
]

def cabecalho(c, atual):
    ac = ' aria-current="page"'
    itens = "".join(
        f'<li><a href="{c.u(p)}"{ac if atual and atual.startswith(p) else ""}>{esc(n)}</a></li>'
        for p, n in NAV)
    itens_m = "".join(f'<li><a href="{c.u(p)}">{esc(n)}</a></li>' for p, n in NAV)
    wa_link = wa("Olá, Besides! Vim pelo site e gostaria de atendimento.")
    return f'''<a class="pular" href="#conteudo">Pular para o conteúdo</a>
<div class="barra"><div class="caixa">
  <div class="barra__contato"><a href="tel:{D.TELEFONE_E164}" data-evento="clique_telefone" data-origem="barra">{D.TELEFONE}</a><span class="longo"><a href="mailto:{D.EMAIL}" data-evento="clique_email" data-origem="barra">{D.EMAIL}</a></span></div>
  <a href="{c.u("suporte-remoto/")}">Já é cliente? Abrir chamado e suporte remoto</a>
</div></div>
<header class="topo"><div class="caixa">
  <a class="topo__logo" href="{c.u("")}"><img src="{c.u("assets/img/logo-besides.png")}" width="166" height="40" alt="Besides Informática"></a>
  <nav class="nav" aria-label="Principal">
    <ul class="nav__lista">{itens}</ul>
    <a class="btn btn--whatsapp" href="{wa_link}" target="_blank" rel="noopener" data-evento="clique_whatsapp" data-origem="cabecalho">{ICONES["whatsapp"]}WhatsApp</a>
  </nav>
  <details class="menu"><summary>{ICONES["menu"]}Menu</summary>
    <div class="menu__painel"><ul>{itens_m}<li><a href="{c.u("suporte-remoto/")}">Área do cliente</a></li></ul>
    <a class="btn btn--whatsapp" href="{wa_link}" target="_blank" rel="noopener" data-evento="clique_whatsapp" data-origem="menu">{ICONES["whatsapp"]}Falar no WhatsApp</a></div>
  </details>
</div></header>'''

def faixa_contato(c, titulo, texto, msg, rotulo="Pedir orçamento pelo WhatsApp", origem="faixa"):
    return f'''<section class="secao" aria-labelledby="faixa-titulo"><div class="caixa">
<div class="faixa"><div><h2 id="faixa-titulo">{titulo}</h2><p>{texto}</p></div>
<div class="botoes"><a class="btn btn--primario" href="{wa(msg)}" target="_blank" rel="noopener" data-evento="clique_whatsapp" data-origem="{origem}">{esc(rotulo)}</a>
<a class="btn btn--secundario" href="tel:{D.TELEFONE_E164}" data-evento="clique_telefone" data-origem="{origem}">{D.TELEFONE}</a></div></div>
</div></section>'''

def rodape(c):
    cnpj = f"CNPJ {D.CNPJ}" if D.CNPJ else "CNPJ " + pend()
    return f'''<footer class="rodape"><div class="caixa">
<div class="rodape__grade">
  <div class="rodape__marca"><img src="{c.u("assets/img/logo-besides-negativo.png")}" width="220" height="60" alt="Besides Informática" loading="lazy">
  <p>Suporte de TI, infraestrutura e assistência técnica em Criciúma desde {D.FUNDACAO}.</p></div>
  <div><h2>Empresas</h2><ul>
    <li><a href="{c.u("empresas/suporte-de-ti/")}">Suporte de TI</a></li>
    <li><a href="{c.u("empresas/redes-e-servidores/")}">Redes, servidores e backup</a></li>
    <li><a href="{c.u("empresas/seguranca/")}">Segurança e CFTV</a></li>
    <li><a href="{c.u("empresas/telefonia-voip/")}">Telefonia VoIP</a></li>
    <li><a href="{c.u("empresas/erp-e-sistemas/")}">ERP e sistemas</a></li>
  </ul></div>
  <div><h2>Para você</h2><ul>
    <li><a href="{c.u("assistencia-tecnica/")}">Assistência técnica</a></li>
    <li><a href="{c.u("loja/")}">Loja e suprimentos</a></li>
    <li><a href="{c.u("loja/")}#impressoes">Impressões e cópias</a></li>
    <li><a href="{c.u("suporte-remoto/")}">Suporte remoto e chamados</a></li>
    <li><a href="{c.u("conteudos/")}">Conteúdos</a></li>
  </ul></div>
  <div><h2>Contato</h2><ul>
    <li>{esc(endereco_txt())}</li>
    <li><a href="{D.MAPS_URL}" target="_blank" rel="noopener" data-evento="clique_mapa" data-origem="rodape">Como chegar</a></li>
    <li><a href="tel:{D.TELEFONE_E164}" data-evento="clique_telefone" data-origem="rodape">{D.TELEFONE}</a></li>
    <li><a href="{wa("Olá, Besides! Vim pelo site.")}" target="_blank" rel="noopener" data-evento="clique_whatsapp" data-origem="rodape">WhatsApp {D.WHATSAPP}</a></li>
    <li><a href="mailto:{D.EMAIL}" data-evento="clique_email" data-origem="rodape">{D.EMAIL}</a></li>
    <li>{horario_html()}</li>
    <li><a href="{D.INSTAGRAM}" target="_blank" rel="noopener">Instagram</a> · <a href="{D.FACEBOOK}" target="_blank" rel="noopener">Facebook</a></li>
  </ul></div>
</div>
<div class="rodape__base"><span>{esc(D.RAZAO_SOCIAL)} · {cnpj}</span><span><a href="{c.u("privacidade/")}">Privacidade</a></span></div>
</div></footer>
<a class="btn btn--whatsapp flutuante" href="{wa("Olá, Besides! Vim pelo site.")}" target="_blank" rel="noopener" data-evento="clique_whatsapp" data-origem="flutuante">{ICONES["whatsapp"]}WhatsApp</a>'''

def trilha(c, itens):
    lis = []
    for i, (nome, p) in enumerate(itens):
        if i == len(itens) - 1:
            lis.append(f'<li aria-current="page">{esc(nome)}</li>')
        else:
            lis.append(f'<li><a href="{c.u(p)}">{esc(nome)}</a></li>')
    return f'<nav class="trilha" aria-label="Você está em"><ol>{"".join(lis)}</ol></nav>'

def faq(perguntas):
    return '<div class="faq">' + "".join(
        f'<details><summary>{esc(q)}</summary><div class="resposta">{a}</div></details>' for q, a in perguntas) + "</div>"

# ---------- Dados estruturados ----------
def org_schema():
    o = {
        "@type": "ComputerStore",
        "@id": D.SITE + "/#empresa",
        "name": D.NOME,
        "legalName": D.RAZAO_SOCIAL,
        "url": D.SITE + "/",
        "logo": {"@type": "ImageObject", "url": D.SITE + "/assets/img/logo-besides.png"},
        "image": D.SITE + "/assets/img/og-besides.png",
        "description": "Suporte de TI para empresas, redes, servidores, segurança, telefonia VoIP, assistência técnica, venda de equipamentos e suprimentos de informática em Criciúma (SC).",
        "foundingDate": D.FUNDACAO,
        "telephone": D.TELEFONE_E164,
        "email": D.EMAIL,
        "address": {"@type": "PostalAddress", "streetAddress": D.RUA, "addressLocality": D.CIDADE,
                    "addressRegion": D.UF, "postalCode": D.CEP, "addressCountry": "BR"},
        "areaServed": {"@type": "City", "name": "Criciúma"},
        "contactPoint": [
            {"@type": "ContactPoint", "telephone": D.TELEFONE_E164, "contactType": "customer service", "areaServed": "BR", "availableLanguage": "pt-BR"},
            {"@type": "ContactPoint", "telephone": "+" + D.WHATSAPP_NUM, "contactType": "sales", "areaServed": "BR", "availableLanguage": "pt-BR"},
        ],
        "sameAs": [x for x in [D.FACEBOOK, D.INSTAGRAM, D.GOOGLE_PERFIL] if x],
    }
    if D.BAIRRO:
        o["address"]["streetAddress"] = D.RUA
    if D.CNPJ:
        o["taxID"] = D.CNPJ
    if D.HORARIO_SCHEMA:
        o["openingHoursSpecification"] = [
            {"@type": "OpeningHoursSpecification", "dayOfWeek": d, "opens": a, "closes": f}
            for d, a, f in D.HORARIO_SCHEMA]
    return o

def site_schema():
    return {"@type": "WebSite", "@id": D.SITE + "/#site", "url": D.SITE + "/", "name": D.NOME,
            "inLanguage": "pt-BR", "publisher": {"@id": D.SITE + "/#empresa"}}

def breadcrumb_schema(itens):
    return {"@type": "BreadcrumbList", "itemListElement": [
        {"@type": "ListItem", "position": i + 1, "name": n, "item": D.SITE + "/" + p}
        for i, (n, p) in enumerate(itens)]}

def service_schema(caminho, nome, descricao, tipo):
    return {"@type": "Service", "@id": D.SITE + "/" + caminho + "#servico", "name": nome,
            "serviceType": tipo, "description": descricao, "provider": {"@id": D.SITE + "/#empresa"},
            "areaServed": {"@type": "City", "name": "Criciúma"}, "url": D.SITE + "/" + caminho}

def webpage_schema(caminho, titulo, descricao, tipo="WebPage"):
    return {"@type": tipo, "@id": D.SITE + "/" + caminho + "#pagina", "url": D.SITE + "/" + caminho,
            "name": titulo, "description": descricao, "inLanguage": "pt-BR",
            "isPartOf": {"@id": D.SITE + "/#site"}, "about": {"@id": D.SITE + "/#empresa"}}

# ---------- Documento ----------
def documento(c, pg):
    canon = D.SITE + "/" + pg["caminho"]
    robots = "index, follow, max-image-preview:large" if pg.get("indexar", True) else "noindex, follow"
    grafo = [org_schema(), site_schema()] if pg["caminho"] == "" else []
    grafo += [webpage_schema(pg["caminho"], pg["titulo"], pg["descricao"], pg.get("tipo_pagina", "WebPage"))]
    if pg.get("trilha") and len(pg["trilha"]) > 1:
        grafo.append(breadcrumb_schema(pg["trilha"]))
    grafo += pg.get("schema", [])
    ld = json.dumps({"@context": "https://schema.org", "@graph": grafo}, ensure_ascii=False, indent=1).replace("</", "<\\/")
    og_img = D.SITE + "/assets/img/og-besides.png"
    corpo = cabecalho(c, pg["caminho"]) + f'\n<main id="conteudo" class="{pg.get("classe", "interna")}">\n' + pg["corpo"] + "\n</main>\n" + rodape(c)
    head = f'''<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>{esc(pg["titulo"])}</title>
<meta name="description" content="{esc(pg["descricao"])}">
<meta name="robots" content="{robots}">
{"" if pg["caminho"].endswith(".html") else f'<link rel="canonical" href="{canon}">'}
<meta name="theme-color" content="#191424">
<meta name="format-detection" content="telephone=no">
<meta property="og:type" content="{pg.get("og_tipo", "website")}">
<meta property="og:locale" content="pt_BR">
<meta property="og:site_name" content="{D.NOME}">
<meta property="og:title" content="{esc(pg.get("og_titulo", pg["titulo"]))}">
<meta property="og:description" content="{esc(pg["descricao"])}">
<meta property="og:url" content="{canon}">
<meta property="og:image" content="{og_img}">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Logotipo da Besides Informática sobre fundo escuro">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{esc(pg.get("og_titulo", pg["titulo"]))}">
<meta name="twitter:description" content="{esc(pg["descricao"])}">
<meta name="twitter:image" content="{og_img}">
<link rel="icon" href="{c.u("favicon.ico")}" sizes="32x32">
<link rel="icon" href="{c.u("assets/img/favicon-192.png")}" type="image/png" sizes="192x192">
<link rel="apple-touch-icon" href="{c.u("assets/img/apple-touch-icon.png")}">
<link rel="manifest" href="{c.u("site.webmanifest")}">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@500;600&family=Instrument+Sans:wght@400;500;600&family=JetBrains+Mono:wght@500&display=swap">
<link rel="stylesheet" href="{c.u("assets/css/site.css")}">
<script type="application/ld+json">
{ld}
</script>'''
    extra = pg.get("artigo_meta", "")
    if c.modo == "previa" and pg["caminho"] == "":
        # a página principal da prévia é envolvida pelo publicador: sem doctype/html/head/body próprios
        return f'''<title>Site novo Besides</title>
<meta name="claude:viewport-fit-sides" content="cover">
{head.replace("<title>" + esc(pg["titulo"]) + "</title>", "").replace('<meta charset="utf-8">', "")}
{extra}
{corpo}
<script src="{c.u("assets/js/site.js")}" defer></script>'''
    return f'''<!doctype html>
<html lang="pt-BR">
<head>
{head}
{extra}
</head>
<body>
{corpo}
<script src="{c.u("assets/js/site.js")}" defer></script>
</body>
</html>
'''
