(() => {
  "use strict";
  const $ = (s, r = document) => r.querySelector(s);
  const list = $("#provenance-list");
  if (!list) return;
  const search = $("#provenance-search");
  const report = $("#provenance-report");
  const confidence = $("#provenance-confidence");
  const source = $("#provenance-source");
  const count = $("#provenance-count");
  const empty = $("#provenance-empty");
  let items = [];
  const escape = (value) => String(value ?? "").replace(/[&<>"']/g, (ch) => ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[ch]));
  const isUrl = (value) => /^https?:\/\//.test(value || "");
  const link = (value, label) => isUrl(value) ? `<a href="${escape(value)}" rel="noreferrer">${label} ↗</a>` : `<span>${escape(value)}</span>`;

  function create(item) {
    const found = isUrl(item.первичный_источник);
    const node = document.createElement("article");
    node.className = "provenance-card";
    node.dataset.report = item.доклад_идентификатор;
    node.dataset.confidence = item.уверенность;
    node.dataset.source = found ? "найден" : "пробел";
    node.innerHTML = `<div class="case-head"><span>${escape(item.идентификатор)}</span><span>${escape(item.уверенность)}</span></div><h2>${escape(item.утверждение)}</h2><p class="provenance-report">${escape(item.доклад)}</p><dl><div><dt>Юрисдикция</dt><dd>${escape(item.юрисдикция)}</dd></div><div><dt>Дата доступа</dt><dd>${escape(item.дата_доступа)}</dd></div><div><dt>Первичная линия</dt><dd>${escape(item.статус_первичного_источника)}</dd></div><div><dt>Условие опровержения</dt><dd>${escape(item.условие_опровержения)}</dd></div></dl><div class="source-row">${link(item.первичный_источник,"Первичный адрес")}${link(item.вторичный_анализ,"Вторичный анализ")}<a href="${escape(item.путь_доклада)}">Доклад →</a></div>`;
    return node;
  }

  function apply() {
    const q = (search.value || "").trim().toLocaleLowerCase("ru");
    let visible = 0;
    list.querySelectorAll(".provenance-card").forEach((node) => {
      const item = items.find((entry) => entry.идентификатор === node.querySelector(".case-head span")?.textContent);
      const hay = `${item.утверждение} ${item.доклад} ${item.юрисдикция} ${item.статус_первичного_источника}`.toLocaleLowerCase("ru");
      const show = (report.value === "все" || node.dataset.report === report.value) && (confidence.value === "все" || node.dataset.confidence === confidence.value) && (source.value === "все" || node.dataset.source === source.value) && (!q || hay.includes(q));
      node.hidden = !show;
      if (show) visible += 1;
    });
    count.textContent = String(visible);
    empty.classList.toggle("is-visible", visible === 0);
  }

  fetch("происхождение-утверждений.json", {cache:"no-store"}).then((response) => {
    if (!response.ok) throw new Error("Карта происхождения недоступна");
    return response.json();
  }).then((data) => {
    items = data.утверждения || [];
    const reports = [...new Map(items.map((item) => [item.доклад_идентификатор,item.доклад])).entries()];
    reports.forEach(([value,label]) => { const option=document.createElement("option"); option.value=value; option.textContent=`${value} · ${label}`; report.appendChild(option); });
    [...new Set(items.map((item) => item.уверенность))].sort().forEach((value) => { const option=document.createElement("option"); option.value=value; option.textContent=value; confidence.appendChild(option); });
    const fragment=document.createDocumentFragment(); items.forEach((item) => fragment.appendChild(create(item))); list.appendChild(fragment);
    search.addEventListener("input",apply); [report,confidence,source].forEach((control)=>control.addEventListener("change",apply));
    apply();
  }).catch((error) => { list.innerHTML=`<div class="boundary-box"><h2>Карта не загружена</h2><p>${escape(error.message)}. Откройте сайт через сетевой адрес.</p></div>`; });
})();
