(function () {
  const form = document.getElementById("itcdForm");
  if (!form) return;
  const byId = (id) => document.getElementById(id);
  const ids = ["dataFato", "outorganteNome", "outorganteDocumento", "outorgadoNome", "outorgadoDocumento", "outorgadoTelefone", "outorgadoEmail", "requerenteNome", "requerenteCpf", "requerenteTelefone", "requerenteEmail", "processo1", "avaliacao1", "valor1", "parcelas1", "processo2", "avaliacao2", "valor2", "parcelas2", "local", "dataRequerimento"];
  const c = Object.fromEntries(ids.map((id) => [id, byId(id)]));
  const groups = { natureza: [byId("naturezaGrid"), byId("naturezaError")], qualificacao: [byId("qualificacaoGrid"), byId("qualificacaoError")], origem1: [byId("origem1Grid"), byId("origem1Error")], origem2: [byId("origem2Grid"), byId("origem2Error")] };
  const message = byId("formMessage");
  const sameRequerenteOutorgado = byId("sameRequerenteOutorgado");
  const copyDataStatus = byId("copyDataStatus");
  const digits = (v) => v.replace(/\D/g, "");
  const selected = (name) => form.querySelector(`input[name="${name}"]:checked`)?.value || "";
  function maskDocument(v) { const d = digits(v).slice(0, 14); return d.length <= 11 ? d.replace(/(\d{3})(\d)/, "$1.$2").replace(/(\d{3})(\d)/, "$1.$2").replace(/(\d{3})(\d{1,2})$/, "$1-$2") : d.replace(/(\d{2})(\d)/, "$1.$2").replace(/(\d{3})(\d)/, "$1.$2").replace(/(\d{3})(\d)/, "$1/$2").replace(/(\d{4})(\d{1,2})$/, "$1-$2"); }
  function maskPhone(v) { return digits(v).slice(0, 11).replace(/^(\d{2})(\d)/, "($1) $2").replace(/(\d{5})(\d{1,4})$/, "$1-$2"); }
  function maskMoney(v) { const d = digits(v); return d ? new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL" }).format(Number(d) / 100) : ""; }
  function formatDate(v, long) { if (!v) return "-"; const [y, m, d] = v.split("-"); if (!long) return `${d}/${m}/${y}`; return `${d} de ${new Date(+y, +m - 1, +d).toLocaleDateString("pt-BR", { month: "long" })} de ${y}`; }
  function setError(control, text) { const w = control.closest(".producer-form-field"); w?.classList.add("is-invalid"); control.setAttribute("aria-invalid", "true"); const n = w?.querySelector(".producer-form-field__error"); if (n) n.textContent = text; }
  function clearError(control) { const w = control.closest(".producer-form-field"); w?.classList.remove("is-invalid"); control.removeAttribute("aria-invalid"); const n = w?.querySelector(".producer-form-field__error"); if (n) n.textContent = ""; }
  function groupError(name, text) { groups[name][0].classList.toggle("is-invalid", !!text); groups[name][1].textContent = text; }
  function validCpf(v) { const d = digits(v); if (!/^\d{11}$/.test(d) || /^(\d)\1{10}$/.test(d)) return false; const calc = (n) => { let s = 0; for (let i = 0; i < n; i++) s += +d[i] * (n + 1 - i); const r = (s * 10) % 11; return r === 10 ? 0 : r; }; return calc(9) === +d[9] && calc(10) === +d[10]; }
  function validCnpj(v) {
    const d = digits(v);
    if (!/^\d{14}$/.test(d) || /^(\d)\1{13}$/.test(d)) return false;
    const calculateDigit = (base, weights) => {
      const sum = base.split("").reduce((total, digit, index) => total + Number(digit) * weights[index], 0);
      const remainder = sum % 11;
      return remainder < 2 ? 0 : 11 - remainder;
    };
    const first = calculateDigit(d.slice(0, 12), [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);
    const second = calculateDigit(d.slice(0, 12) + first, [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);
    return first === Number(d[12]) && second === Number(d[13]);
  }
  function validateCpfControl(control, showRequired = false) {
    const value = digits(control.value);
    if (!value) {
      if (showRequired) setError(control, "Informe o CPF."); else clearError(control);
      return false;
    }
    if (value.length !== 11) { setError(control, "O CPF deve conter 11 dígitos."); return false; }
    if (!validCpf(value)) { setError(control, "CPF inválido. Verifique os dígitos informados."); return false; }
    clearError(control);
    return true;
  }
  function validateCpfCnpjControl(control, showRequired = false) {
    const value = digits(control.value);
    if (!value) {
      if (showRequired) setError(control, "Informe o CPF ou CNPJ."); else clearError(control);
      return false;
    }
    if (value.length !== 11 && value.length !== 14) { setError(control, "Informe um CPF com 11 dígitos ou CNPJ com 14 dígitos."); return false; }
    if (value.length === 11 && !validCpf(value)) { setError(control, "CPF inválido. Verifique os dígitos informados."); return false; }
    if (value.length === 14 && !validCnpj(value)) { setError(control, "CNPJ inválido. Verifique os dígitos informados."); return false; }
    clearError(control);
    return true;
  }
  function copyOutorgadoToRequerente(showStatus = false) {
    c.requerenteNome.value = c.outorgadoNome.value;
    c.requerenteCpf.value = c.outorgadoDocumento.value;
    c.requerenteTelefone.value = c.outorgadoTelefone.value;
    c.requerenteEmail.value = c.outorgadoEmail.value;
    [c.requerenteNome, c.requerenteCpf, c.requerenteTelefone, c.requerenteEmail].forEach(clearError);
    if (showStatus) copyDataStatus.textContent = "Dados do outorgado copiados para o requerente.";
    message.textContent = "";
    message.classList.remove("is-error");
    updatePreview();
  }
  function put(id, value) { const n = byId(`p-${id}`); if (n) n.textContent = value || "-"; }
  function updatePreview() {
    ids.forEach((id) => put(id, c[id].value.trim()));
    ["natureza", "qualificacao", "origem1", "origem2"].forEach((name) => put(name, selected(name)));
    ["dataFato", "avaliacao1", "avaliacao2"].forEach((id) => put(id, formatDate(c[id].value)));
    put("dataRequerimento", c.dataRequerimento.value ? formatDate(c.dataRequerimento.value, true) : "_______ de ______________________ de __________");
    byId("p-declaracao").textContent = byId("declaracao").checked ? "X" : "";
    byId("p-debt2").hidden = ![selected("origem2"), c.processo2.value, c.avaliacao2.value, c.valor2.value, c.parcelas2.value].some(Boolean);
  }
  function validate() {
    ids.forEach((id) => clearError(c[id])); Object.keys(groups).forEach((n) => groupError(n, ""));
    const errors = []; let first = null;
    const required = (id, text) => { if (!c[id].value.trim()) { setError(c[id], text); errors.push(text); first ||= c[id]; } };
    [["dataFato", "Informe a data do fato gerador."], ["outorganteNome", "Informe o nome do outorgante."], ["outorganteDocumento", "Informe o CPF/CNPJ do outorgante."], ["outorgadoNome", "Informe o nome do outorgado."], ["outorgadoDocumento", "Informe o CPF/CNPJ do outorgado."], ["outorgadoTelefone", "Informe o telefone do outorgado."], ["outorgadoEmail", "Informe o e-mail do outorgado."], ["requerenteNome", "Informe o nome do requerente."], ["requerenteCpf", "Informe o CPF do requerente."], ["requerenteTelefone", "Informe o telefone do requerente."], ["requerenteEmail", "Informe o e-mail do requerente."], ["processo1", "Informe o processo SEI."], ["avaliacao1", "Informe a data da avaliação."], ["valor1", "Informe o valor total."], ["parcelas1", "Informe o número de parcelas."], ["local", "Informe o local."], ["dataRequerimento", "Informe a data do requerimento."]].forEach(([id, t]) => required(id, t));
    [["natureza", "Selecione a natureza."], ["qualificacao", "Selecione a qualificação."], ["origem1", "Selecione a origem do débito."]].forEach(([n, t]) => { if (!selected(n)) { groupError(n, t); errors.push(t); first ||= groups[n][0].querySelector("input"); } });
    [[c.outorganteDocumento, validateCpfCnpjControl], [c.outorgadoDocumento, validateCpfCnpjControl], [c.requerenteCpf, validateCpfControl]].forEach(([control, validator]) => {
      if (!validator(control, true)) { errors.push("Documento inválido."); first ||= control; }
    });
    ["outorgadoEmail", "requerenteEmail"].forEach((id) => { if (c[id].value && !c[id].checkValidity()) { setError(c[id], "Informe um e-mail válido."); errors.push("E-mail inválido."); first ||= c[id]; } });
    if (c.parcelas1.value && (+c.parcelas1.value < 1 || +c.parcelas1.value > 24)) { setError(c.parcelas1, "Informe de 1 a 24 parcelas."); errors.push("Parcelas inválidas."); first ||= c.parcelas1; }
    const debt2 = [selected("origem2"), c.processo2.value, c.avaliacao2.value, c.valor2.value, c.parcelas2.value].some(Boolean);
    if (debt2) { if (!selected("origem2")) { groupError("origem2", "Selecione a origem do segundo débito."); errors.push("Segundo débito incompleto."); first ||= groups.origem2[0].querySelector("input"); } [["processo2", "Informe o processo SEI."], ["avaliacao2", "Informe a data da avaliação."], ["valor2", "Informe o valor total."], ["parcelas2", "Informe o número de parcelas."]].forEach(([id, t]) => required(id, t)); if (c.parcelas2.value && (+c.parcelas2.value < 1 || +c.parcelas2.value > 24)) { setError(c.parcelas2, "Informe de 1 a 24 parcelas."); errors.push("Parcelas inválidas."); first ||= c.parcelas2; } }
    if (!byId("declaracao").checked) { byId("declaracaoBox").classList.add("is-invalid"); byId("declaracaoError").textContent = "Confirme a declaração para continuar."; errors.push("Declaração pendente."); first ||= byId("declaracao"); }
    return { ok: !errors.length, first };
  }
  function printDocument() {
    const clone = byId("preview").cloneNode(true), source = byId("preview").querySelector("img"), image = clone.querySelector("img"); image.src = source.currentSrc || source.src;
    const win = window.open("", "_blank", "width=900,height=1200"); if (!win) { message.textContent = "Não foi possível abrir a janela de impressão. Verifique o bloqueio de pop-up."; message.classList.add("is-error"); return; }
    const links = Array.from(document.styleSheets).filter((s) => s.href).map((s) => `<link rel="stylesheet" href="${s.href}">`).join("");
    win.document.write(`<!doctype html><html lang="pt-BR"><head><meta charset="UTF-8"><title>Requerimento de Parcelamento de ITCD</title>${links}<style>@page{size:A4 portrait;margin:10mm}body{background:#fff;margin:0}.itcd-preview{box-shadow:none;border:0;padding:0;font-size:8.5pt;line-height:1.25;gap:.35rem}.itcd-preview section{gap:.2rem;padding-top:.3rem}.itcd-preview section,.producer-preview-doc__signature,.itcd-declaration-signature{break-inside:avoid-page;page-break-inside:avoid}.itcd-declaration-signature{gap:.25rem}.itcd-declaration-signature .producer-preview-doc__signature{gap:.25rem;padding-top:.3rem}.itcd-declaration-signature .producer-preview-doc__sign-line{margin-top:.65rem}.producer-preview-doc__details-grid{gap:.15rem .55rem}.producer-preview-doc__details-grid div{padding-bottom:.08rem}.itcd-guidance{break-before:page;page-break-before:always}.itcd-document-header{grid-template-columns:20% 45% 35%;gap:0;border:0}.itcd-document-header__logo img{width:70px}.itcd-document-header__institution strong{font-size:7.4pt}.itcd-document-header__title .producer-preview-doc__title{font-size:9pt}.itcd-debt-table{font-size:7.5pt}.itcd-footnote{font-size:6.8pt}</style></head><body>${clone.outerHTML}<script>window.onload=()=>setTimeout(()=>window.print(),200);window.onafterprint=()=>window.close();<\/script></body></html>`); win.document.close();
  }
  ids.filter((id) => !["outorganteDocumento", "outorgadoDocumento", "requerenteCpf"].includes(id)).forEach((id) => { c[id].addEventListener("input", () => { clearError(c[id]); message.textContent = ""; message.classList.remove("is-error"); updatePreview(); }); c[id].addEventListener("change", updatePreview); });
  ["outorganteDocumento", "outorgadoDocumento"].forEach((id) => {
    c[id].addEventListener("input", (e) => { e.target.value = maskDocument(e.target.value); message.textContent = ""; message.classList.remove("is-error"); if (e.target.closest(".producer-form-field")?.classList.contains("is-invalid")) validateCpfCnpjControl(e.target, true); updatePreview(); });
    c[id].addEventListener("blur", () => validateCpfCnpjControl(c[id], false));
  });
  c.requerenteCpf.addEventListener("input", (e) => { e.target.value = maskDocument(e.target.value); message.textContent = ""; message.classList.remove("is-error"); if (e.target.closest(".producer-form-field")?.classList.contains("is-invalid")) validateCpfControl(e.target, true); updatePreview(); });
  c.requerenteCpf.addEventListener("blur", () => validateCpfControl(c.requerenteCpf, false));
  ["outorgadoTelefone", "requerenteTelefone"].forEach((id) => c[id].addEventListener("input", (e) => { e.target.value = maskPhone(e.target.value); updatePreview(); }));
  ["valor1", "valor2"].forEach((id) => c[id].addEventListener("input", (e) => { e.target.value = maskMoney(e.target.value); updatePreview(); }));
  form.querySelectorAll('input[type="radio"]').forEach((r) => r.addEventListener("change", () => { if (groups[r.name]) groupError(r.name, ""); updatePreview(); }));
  sameRequerenteOutorgado.addEventListener("change", () => {
    if (sameRequerenteOutorgado.checked) copyOutorgadoToRequerente(true);
    else copyDataStatus.textContent = "";
  });
  [c.outorgadoNome, c.outorgadoDocumento, c.outorgadoTelefone, c.outorgadoEmail].forEach((control) => {
    control.addEventListener("input", () => {
      if (sameRequerenteOutorgado.checked) copyOutorgadoToRequerente(false);
    });
  });
  byId("declaracao").addEventListener("change", () => { byId("declaracaoBox").classList.remove("is-invalid"); byId("declaracaoError").textContent = ""; updatePreview(); });
  byId("printBtn").addEventListener("click", () => { const r = validate(); if (!r.ok) { message.textContent = "Revise os campos destacados antes de imprimir o documento."; message.classList.add("is-error"); r.first?.scrollIntoView({ behavior: "smooth", block: "center" }); r.first?.focus(); return; } message.textContent = ""; message.classList.remove("is-error"); printDocument(); });
  byId("resetBtn").addEventListener("click", () => { form.reset(); c.local.value = "Boa Vista/RR"; ids.forEach((id) => clearError(c[id])); Object.keys(groups).forEach((n) => groupError(n, "")); byId("declaracaoBox").classList.remove("is-invalid"); byId("declaracaoError").textContent = ""; copyDataStatus.textContent = ""; message.textContent = ""; updatePreview(); });
  updatePreview();
})();
