(function () {
  const form = document.getElementById("producerDeclForm");

  if (!form) {
    return;
  }

  const elements = {
    nome: document.getElementById("nome"),
    cpf: document.getElementById("cpf"),
    local: document.getElementById("local"),
    data: document.getElementById("data"),
    atividade: document.getElementById("atividade"),
    comunidade: document.getElementById("comunidade"),
    municipio: document.getElementById("municipio"),
    terra: document.getElementById("terra"),
    ciencia: document.getElementById("ciencia"),
    catGrid: document.getElementById("catGrid"),
    categoriaError: document.getElementById("categoriaError"),
    cienciaBox: document.getElementById("cienciaBox"),
    cienciaError: document.getElementById("cienciaError"),
    formMessage: document.getElementById("formMessage"),
    printBtn: document.getElementById("printBtn"),
    resetBtn: document.getElementById("resetBtn"),
    previewRoot: document.getElementById("preview"),
    previewName: document.getElementById("p-nome"),
    previewCpf: document.getElementById("p-cpf"),
    previewLocal: document.getElementById("p-local"),
    previewData: document.getElementById("p-data"),
    previewAtividade: document.getElementById("p-atividade"),
    previewComunidade: document.getElementById("p-comunidade"),
    previewMunicipio: document.getElementById("p-municipio"),
    previewTerra: document.getElementById("p-terra"),
    previewCategoryList: document.querySelectorAll("#p-catlist li")
  };

  const categoryInputs = Array.from(form.querySelectorAll('input[name="categoria"]'));

  function digitsOnly(value) {
    return value.replace(/\D/g, "");
  }

  function maskCpf(value) {
    const digits = digitsOnly(value).slice(0, 11);

    if (digits.length > 9) {
      return digits.replace(/(\d{3})(\d{3})(\d{3})(\d{1,2})/, "$1.$2.$3-$4");
    }

    if (digits.length > 6) {
      return digits.replace(/(\d{3})(\d{3})(\d{1,3})/, "$1.$2.$3");
    }

    if (digits.length > 3) {
      return digits.replace(/(\d{3})(\d{1,3})/, "$1.$2");
    }

    return digits;
  }

  function formatDate(isoDate) {
    if (!isoDate) {
      return "___/___/______";
    }

    const [year, month, day] = isoDate.split("-");
    return `${day}/${month}/${year}`;
  }

  function getFieldWrapper(control) {
    return control.closest(".producer-form-field");
  }

  function setFieldError(control, message) {
    const wrapper = getFieldWrapper(control);

    if (!wrapper) {
      return;
    }

    const error = wrapper.querySelector(".producer-form-field__error");
    wrapper.classList.add("is-invalid");
    control.setAttribute("aria-invalid", "true");

    if (error) {
      error.textContent = message;
    }
  }

  function clearFieldError(control) {
    const wrapper = getFieldWrapper(control);

    if (!wrapper) {
      return;
    }

    const error = wrapper.querySelector(".producer-form-field__error");
    wrapper.classList.remove("is-invalid");
    control.removeAttribute("aria-invalid");

    if (error) {
      error.textContent = "";
    }
  }

  function setGroupError(container, errorNode, message) {
    container.classList.add("is-invalid");
    errorNode.textContent = message;
  }

  function clearGroupError(container, errorNode) {
    container.classList.remove("is-invalid");
    errorNode.textContent = "";
  }

  function validateCpfDigits(cpfDigits) {
    if (!/^\d{11}$/.test(cpfDigits)) {
      return false;
    }

    if (/^(\d)\1{10}$/.test(cpfDigits)) {
      return false;
    }

    let sum = 0;

    for (let index = 0; index < 9; index += 1) {
      sum += Number(cpfDigits[index]) * (10 - index);
    }

    let checkDigit = (sum * 10) % 11;

    if (checkDigit === 10) {
      checkDigit = 0;
    }

    if (checkDigit !== Number(cpfDigits[9])) {
      return false;
    }

    sum = 0;

    for (let index = 0; index < 10; index += 1) {
      sum += Number(cpfDigits[index]) * (11 - index);
    }

    checkDigit = (sum * 10) % 11;

    if (checkDigit === 10) {
      checkDigit = 0;
    }

    return checkDigit === Number(cpfDigits[10]);
  }

  function validateCpfField(options = {}) {
    const { forceMessage = false } = options;
    const rawValue = elements.cpf.value.trim();
    const cpfDigits = digitsOnly(rawValue);

    if (cpfDigits === "") {
      if (forceMessage) {
        setFieldError(elements.cpf, "Informe o CPF.");
      } else {
        clearFieldError(elements.cpf);
      }

      return false;
    }

    if (cpfDigits.length !== 11) {
      setFieldError(elements.cpf, "O CPF deve conter 11 dígitos.");
      return false;
    }

    if (!validateCpfDigits(cpfDigits)) {
      setFieldError(elements.cpf, "CPF inválido. Verifique os dígitos informados.");
      return false;
    }

    clearFieldError(elements.cpf);
    return true;
  }

  function updatePreview() {
    elements.previewName.textContent = elements.nome.value.trim() || "_____________________";
    elements.previewCpf.textContent = elements.cpf.value.trim() || "______________";
    elements.previewLocal.textContent = elements.local.value.trim() || "___________________";
    elements.previewData.textContent = formatDate(elements.data.value);
    elements.previewAtividade.textContent = elements.atividade.value.trim() || "-";
    elements.previewComunidade.textContent = elements.comunidade.value.trim() || "-";
    elements.previewMunicipio.textContent = elements.municipio.value || "-";
    elements.previewTerra.textContent = elements.terra.value.trim() || "-";

    const selectedCategory = form.querySelector('input[name="categoria"]:checked');
    const selectedValue = selectedCategory ? selectedCategory.value : "";

    elements.previewCategoryList.forEach((item) => {
      const isSelected = selectedValue !== "" && item.dataset.v === selectedValue;
      item.classList.toggle("is-selected", isSelected);
      item.querySelector(".producer-preview-doc__checkbox").textContent = isSelected ? "X" : "";
    });
  }

  function openPrintDocument() {
    if (!elements.previewRoot) {
      window.print();
      return;
    }

    const previewClone = elements.previewRoot.cloneNode(true);
    const previewImage = previewClone.querySelector("img");

    if (previewImage) {
      const sourceImage = elements.previewRoot.querySelector("img");
      previewImage.src = sourceImage?.currentSrc || sourceImage?.src || previewImage.src;
    }

    const printWindow = window.open("", "_blank", "width=900,height=1200");

    if (!printWindow) {
      elements.formMessage.textContent = "Nao foi possivel abrir a janela de impressao. Verifique o bloqueio de pop-up.";
      elements.formMessage.classList.add("is-error");
      return;
    }

    const printStyles = `
      @page { size: A4 portrait; margin: 12mm; }
      html, body { margin: 0; padding: 0; background: #ffffff; }
      body {
        color: #1f1f1f;
        font-family: Georgia, "Times New Roman", serif;
        -webkit-print-color-adjust: exact;
        print-color-adjust: exact;
      }
      .print-sheet {
        padding: 0;
      }
      .producer-preview-doc {
        display: grid;
        gap: 0.8rem;
        font-size: 12pt;
        line-height: 1.5;
        color: #1f1f1f;
      }
      .producer-preview-doc p {
        margin: 0;
        text-align: justify;
      }
      .producer-preview-doc__header {
        display: flex;
        align-items: center;
        gap: 0.85rem;
      }
      .producer-preview-doc__header img {
        width: 62px;
        height: auto;
        flex-shrink: 0;
      }
      .producer-preview-doc__header-body {
        flex: 1;
        text-align: center;
      }
      .producer-preview-doc__title {
        margin: 0;
        font-size: 14pt;
        line-height: 1.25;
        font-weight: 700;
        text-transform: uppercase;
      }
      .producer-preview-doc__subtitle {
        margin: 0.2rem 0 0;
        font-size: 9pt;
        color: #666666;
      }
      .producer-preview-doc__fill {
        display: inline-block;
        min-width: 3.8rem;
        padding: 0 0.12rem;
        border-bottom: 1px solid #1f1f1f;
        color: #244a86;
        font-weight: 700;
      }
      .producer-preview-doc__category-list {
        margin: 0.2rem 0 0;
        padding: 0;
        list-style: none;
        font-size: 10.5pt;
      }
      .producer-preview-doc__category-list li {
        display: flex;
        align-items: center;
        gap: 0.45rem;
        margin: 0.14rem 0;
      }
      .producer-preview-doc__checkbox {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 11px;
        height: 11px;
        border: 1px solid #1f1f1f;
        font-size: 8px;
        line-height: 1;
        color: #ffffff;
        flex-shrink: 0;
      }
      .producer-preview-doc__category-list li.is-selected .producer-preview-doc__checkbox {
        background: #1f1f1f;
      }
      .producer-preview-doc__signature {
        display: grid;
        gap: 0.5rem;
        padding-top: 0.7rem;
        border-top: 1px solid #d5dbe3;
      }
      .producer-preview-doc__signature-gap {
        display: inline-block;
        width: 1rem;
      }
      .producer-preview-doc__sign-line {
        height: 1px;
        margin-top: 1.2rem;
        border-bottom: 1px solid #1f1f1f;
      }
      .producer-preview-doc__sign-caption {
        margin: 0;
        text-align: center;
        font-size: 9pt;
        color: #555555;
      }
      .producer-preview-doc__details {
        display: grid;
        gap: 0.5rem;
        padding-top: 0.7rem;
        border-top: 1px solid #d5dbe3;
      }
      .producer-preview-doc__details h3 {
        margin: 0;
        color: #244a86;
        font-size: 11pt;
      }
      .producer-preview-doc__details-grid {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 0.3rem 0.85rem;
        font-size: 10pt;
      }
      .producer-preview-doc__details-grid div {
        padding-bottom: 0.15rem;
        border-bottom: 1px dotted #c9d1db;
      }
      .producer-preview-doc__details-grid span {
        color: #666666;
      }
      .producer-preview-doc__details-grid strong {
        color: #1f1f1f;
        font-weight: 400;
      }
    `;

    printWindow.document.open();
    printWindow.document.write(`<!DOCTYPE html>
      <html lang="pt-BR">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Declaracao Unica para Inscricao Simplificada</title>
          <style>${printStyles}</style>
        </head>
        <body>
          <main class="print-sheet">${previewClone.outerHTML}</main>
          <script>
            window.addEventListener("load", function () {
              const images = Array.from(document.images);
              const waits = images.map(function (img) {
                if (img.complete) {
                  return Promise.resolve();
                }
                return new Promise(function (resolve) {
                  img.addEventListener("load", resolve, { once: true });
                  img.addEventListener("error", resolve, { once: true });
                });
              });

              Promise.all(waits).then(function () {
                setTimeout(function () {
                  window.focus();
                  window.print();
                }, 120);
              });

              window.addEventListener("afterprint", function () {
                window.close();
              }, { once: true });
            });
          <\/script>
        </body>
      </html>`);
    printWindow.document.close();
  }

  function clearAllErrors() {
    [
      elements.nome,
      elements.cpf,
      elements.local,
      elements.data,
      elements.atividade,
      elements.comunidade,
      elements.municipio,
      elements.terra
    ].forEach(clearFieldError);

    clearGroupError(elements.catGrid, elements.categoriaError);
    clearGroupError(elements.cienciaBox, elements.cienciaError);
    elements.formMessage.textContent = "";
    elements.formMessage.classList.remove("is-error");
  }

  function validateRequiredField(control, message) {
    const value = typeof control.value === "string" ? control.value.trim() : control.value;

    if (!value) {
      setFieldError(control, message);
      return false;
    }

    clearFieldError(control);
    return true;
  }

  function validateForm() {
    clearAllErrors();

    const problems = [];
    let firstInvalid = null;

    const requiredFields = [
      [elements.nome, "Informe o nome completo."],
      [elements.local, "Informe o local da declaração."],
      [elements.data, "Informe a data da declaração."],
      [elements.municipio, "Selecione o município."]
    ];

    requiredFields.forEach(([control, message]) => {
      if (!validateRequiredField(control, message)) {
        problems.push(message);

        if (!firstInvalid) {
          firstInvalid = control;
        }
      }
    });

    if (!validateCpfField({ forceMessage: true })) {
      problems.push("Corrija o CPF informado.");

      if (!firstInvalid) {
        firstInvalid = elements.cpf;
      }
    }

    if (!form.querySelector('input[name="categoria"]:checked')) {
      setGroupError(elements.catGrid, elements.categoriaError, "Selecione uma categoria.");
      problems.push("Selecione uma categoria.");

      if (!firstInvalid) {
        firstInvalid = categoryInputs[0] || elements.catGrid;
      }
    }

    if (!elements.ciencia.checked) {
      setGroupError(
        elements.cienciaBox,
        elements.cienciaError,
        "Confirme a declaração de veracidade para continuar."
      );
      problems.push("Confirme a declaração de veracidade.");

      if (!firstInvalid) {
        firstInvalid = elements.ciencia;
      }
    }

    return {
      isValid: problems.length === 0,
      problems,
      firstInvalid
    };
  }

  [
    elements.nome,
    elements.local,
    elements.data,
    elements.atividade,
    elements.comunidade,
    elements.municipio,
    elements.terra
  ].forEach((control) => {
    control.addEventListener("input", () => {
      clearFieldError(control);
      elements.formMessage.textContent = "";
      elements.formMessage.classList.remove("is-error");
      updatePreview();
    });

    control.addEventListener("change", updatePreview);
  });

  elements.cpf.addEventListener("input", (event) => {
    event.target.value = maskCpf(event.target.value);
    updatePreview();

    if (getFieldWrapper(elements.cpf)?.classList.contains("is-invalid")) {
      validateCpfField({ forceMessage: true });
    }
  });

  elements.cpf.addEventListener("blur", () => {
    validateCpfField({ forceMessage: digitsOnly(elements.cpf.value) !== "" });
  });

  categoryInputs.forEach((input) => {
    input.addEventListener("change", () => {
      clearGroupError(elements.catGrid, elements.categoriaError);
      elements.formMessage.textContent = "";
      elements.formMessage.classList.remove("is-error");
      updatePreview();
    });
  });

  elements.ciencia.addEventListener("change", () => {
    clearGroupError(elements.cienciaBox, elements.cienciaError);
    elements.formMessage.textContent = "";
    elements.formMessage.classList.remove("is-error");
  });

  elements.printBtn.addEventListener("click", () => {
    const validation = validateForm();

    if (!validation.isValid) {
      elements.formMessage.textContent = "Revise os campos destacados antes de imprimir o documento.";
      elements.formMessage.classList.add("is-error");

      if (validation.firstInvalid) {
        validation.firstInvalid.scrollIntoView({ behavior: "smooth", block: "center" });

        if (typeof validation.firstInvalid.focus === "function") {
          validation.firstInvalid.focus();
        }
      }

      return;
    }

    elements.formMessage.textContent = "";
    elements.formMessage.classList.remove("is-error");
    openPrintDocument();
  });

  elements.resetBtn.addEventListener("click", () => {
    form.reset();
    clearAllErrors();
    updatePreview();
  });
  updatePreview();
})();
