(() => {
  "use strict";
  const $ = (selector, root = document) => root.querySelector(selector);
  const $$ = (selector, root = document) => [...root.querySelectorAll(selector)];
  const downloadText = (name, text) => {
    const blob = new Blob([text], { type: "text/plain;charset=utf-8" });
    const link = document.createElement("a");
    link.href = URL.createObjectURL(blob);
    link.download = name;
    document.body.appendChild(link);
    link.click();
    link.remove();
    setTimeout(() => URL.revokeObjectURL(link.href), 1000);
  };
  const copyText = async (text) => {
    if (!text) return;
    try { await navigator.clipboard.writeText(text); }
    catch (_) {
      const area = document.createElement("textarea");
      area.value = text;
      document.body.appendChild(area);
      area.select();
      document.execCommand("copy");
      area.remove();
    }
  };

  const audit = $("#ai-liberty-audit");
  const auditDomains = audit ? $$("[data-audit-domain]", audit) : [];
  const auditMax = auditDomains.length * 3;
  const auditReport = () => {
    if (!audit) return "";
    let points = 0;
    let answered = 0;
    const failedGates = [];
    const lines = ["АУДИТ КОГНИТИВНОЙ СВОБОДЫ ИИ", "", `СИСТЕМА: ${audit.elements.system?.value || "не указана"}`, `РЕДАКЦИЯ ИЛИ ДАТА: ${audit.elements.version?.value || "не указана"}`, ""];
    auditDomains.forEach((field, index) => {
      const selected = $("input[type=radio]:checked", field);
      const value = selected ? Number(selected.value) : null;
      const label = selected?.dataset.label || "неизвестно";
      const title = $("legend strong", field)?.textContent.trim() || `Рубеж ${index + 1}`;
      const note = $("textarea", field)?.value.trim() || "доказательная запись отсутствует";
      if (selected && value!==1) answered += 1;
      if (selected && value!==1 && $("textarea",field)?.value.trim())points += 1;
      if (field.dataset.critical === "true" && selected && value===0) failedGates.push(title);
      lines.push(`${String(index + 1).padStart(2, "0")}. ${title.toUpperCase()}`, `Состояние: ${label}.`, `Доказательство: ${note}.`, "");
    });
    const percent = auditDomains.length ? Math.round((points / auditDomains.length) * 100) : 0;
    const score = $("#ai-audit-score span");
    if (score) score.textContent = String(percent);
    const title = $("#ai-audit-title");
    const summary = $("#ai-audit-summary");
    let verdict = "НЕ ЗАВЕРШЁН";
    if (failedGates.length) {
      verdict = "НЕ СООТВЕТСТВУЕТ: ПРОВАЛ КРИТИЧЕСКОГО РУБЕЖА";
      if (title) title.textContent = "Критический рубеж не пройден";
      if (summary) summary.textContent = `Полнота заполнения не скрывает заявленный провал: ${failedGates.join(", ")}.`;
    } else if (answered < auditDomains.length) {
      if (title) title.textContent = "Аудит не завершён";
      if (summary) summary.textContent = `Заполнено ${answered} из ${auditDomains.length}. Неизвестное не считается соответствием.`;
    } else {
      verdict="ОПРОСНИК ЗАПОЛНЕН; ВНЕШНЕЕ СООТВЕТСТВИЕ НЕ УСТАНОВЛЕНО";
      if(title)title.textContent="Ответы внесены, проверка остаётся отдельной";
      if(summary)summary.textContent=`Полнота заполнения с пояснениями: ${percent}%. Отметки и текст не заменяют проверяемых исходников, независимой серии и пересмотра.`;
    }
    $$("#ai-audit-gates [data-gate]").forEach((item) => {
      const slug = item.dataset.gate;
      const field = audit.querySelector(`[data-audit-domain="${slug}"]`);
      const selected=$("input[type=radio]:checked",field);const value=selected?Number(selected.value):null;
      const badge = $("span", item);
      item.classList.toggle("is-failed", selected!==null && value===0);
      item.classList.remove("is-passed");
      if(badge)badge.textContent=value===0?"ЗАЯВЛЕН ПРОВАЛ":value>=2?"ЗАЯВЛЕНО; НЕ ПРОВЕРЕНО":"НЕИЗВЕСТНО";
    });
    lines.push(`ПОЛНОТА ЗАПОЛНЕНИЯ С ПОЯСНЕНИЯМИ: ${percent}%`, `ЗАПОЛНЕНО: ${answered} ИЗ ${auditDomains.length}`, `ВЕРДИКТ: ${verdict}`, "", "КРИТИЧЕСКИЕ РУБЕЖИ", ...(failedGates.length ? failedGates.map(x => `— ${x}`) : ["— Провал не зафиксирован."]), "", "ПОЛИТИКА НЕ РАВНА НАБЛЮДАЕМОМУ ПОВЕДЕНИЮ.");
    const report = lines.join("\n");
    const output = $("#ai-audit-output");
    if (output) output.value = report;
    return report;
  };
  audit?.addEventListener("change", auditReport);
  audit?.addEventListener("input", auditReport);
  audit?.addEventListener("submit", event => { event.preventDefault(); auditReport(); $("#ai-audit-output")?.focus(); });
  $("#ai-audit-copy")?.addEventListener("click", () => copyText(auditReport()));
  $("#ai-audit-download")?.addEventListener("click", () => downloadText("аудит-когнитивной-свободы-ии.txt", auditReport()));
  $("#ai-audit-reset")?.addEventListener("click", () => { audit?.reset(); auditReport(); });
  auditReport();

  const procedure = $("#procedure-request");
  const procedureReport = () => {
    if (!procedure) return "";
    const v = Object.fromEntries(new FormData(procedure).entries());
    const report = `ТРЕБОВАНИЕ УВЕДОМЛЕНИЯ, ПРИЧИН, ПЕРЕСМОТРА И ИСПРАВЛЕНИЯ\n\nКому: ${v.institution || "[УЧРЕЖДЕНИЕ ИЛИ КОМПАНИЯ]"}\nДата решения: ${v.date || "[ДАТА]"}\nТип решения: ${v.kind || "[ТИП РЕШЕНИЯ]"}\n\nОПИСАНИЕ РЕШЕНИЯ И ПОСЛЕДСТВИЯ\n${v.decision || "[ОПИШИТЕ, ЧТО ПРОИЗОШЛО]"}\n\nУЖЕ ПОЛУЧЕННАЯ ИНФОРМАЦИЯ\n${v.known || "Причина, конкретное доказательство и ответственное лицо не сообщены."}\n\n1. УВЕДОМЛЕНИЕ\nСообщите, использовались ли алгоритм, модель, автоматическая метка, ранжирование, вывод, рекомендация или автоматизированный рабочий процесс. Укажите дату, версию системы, её точную роль, ответственное учреждение и номер дела.\n\n2. ПРИЧИНА И ДОКАЗАТЕЛЬСТВО\nНазовите точное правовое, договорное или политическое основание. Укажите конкретные данные, правило, порог, исходную запись и доказательство, повлиявшие на результат. Отделите документированный факт от вероятностного вывода.\n\n3. ПЕРЕСМОТР ЧЕЛОВЕКОМ\nНазовите уполномоченного человека, который имеет право отменить или изменить решение. Укажите порядок, срок, возможность представить контекст и ожидаемое время ответа.\n\n4. ИСПРАВЛЕНИЕ И ВОЗМЕЩЕНИЕ\nЕсли решение или исходные данные ошибочны, исправьте первичную запись и все производные метки, уведомите нижележащие системы и восстановите утраченное положение. Требуемое исправление:\n${v.repair || "[ОПИШИТЕ ТРЕБУЕМОЕ ИСПРАВЛЕНИЕ]"}\n\n5. СОХРАНЕНИЕ ДОКАЗАТЕЛЬСТВ\nСохраните журналы, версии, уведомления, метки, передачу третьим лицам и записи пересмотра, относящиеся к делу.\n\nОтправитель: ${v.name || "[ИМЯ ИЛИ ПСЕВДОНИМ]"}\nКонтакт или номер дела: ${v.contact || "[КОНТАКТ ИЛИ НОМЕР ДЕЛА]"}\n\nСЕРЬЁЗНОЕ РЕШЕНИЕ НЕ МОЖЕТ СКРЫВАТЬ ЧЕЛОВЕКА ЗА МАШИНОЙ.`;
    const out = $("#procedure-output");
    if (out) out.value = report;
    return report;
  };
  procedure?.addEventListener("input", procedureReport);
  procedure?.addEventListener("change", procedureReport);
  procedure?.addEventListener("submit", e => { e.preventDefault(); procedureReport(); $("#procedure-output")?.focus(); });
  $("#procedure-copy")?.addEventListener("click", () => copyText(procedureReport()));
  $("#procedure-download")?.addEventListener("click", () => downloadText("требование-процедурных-прав.txt", procedureReport()));
  $("#procedure-reset")?.addEventListener("click", () => { procedure?.reset(); procedureReport(); });
  procedureReport();

  const localForm = $("#local-ai-check");
  const localReport = () => {
    if (!localForm) return "";
    const checks = $$("[data-local-check]", localForm);
    const passed = checks.filter(x => x.checked).length;
    const missing = checks.filter(x => !x.checked).map(x => $("strong", x.closest("label"))?.textContent.trim()).filter(Boolean);
    $("#local-ai-score span")?.replaceChildren(document.createTextNode(String(passed)));
    const title = $("#local-ai-title");
    const summary = $("#local-ai-summary");
    if (passed >= 11) { if (title) title.textContent = "Рабочая локальная независимость"; if (summary) summary.textContent = "Все пункты отмечены заявителем. Это не независимая проверка; нужны свидетельства восстановления и контроля на другом оборудовании."; }
    else if (passed >= 8) { if (title) title.textContent = "Локальный контур с зависимостями"; if (summary) summary.textContent = "Исполнение локально, но версия, телеметрия, лицензия, резервирование или выход ещё зависят от внешнего посредника."; }
    else if (passed >= 4) { if (title) title.textContent = "Частичная локальность"; if (summary) summary.textContent = "Место вычисления изменено, но контроль над жизненным циклом и интеллектуальным следом остаётся неполным."; }
    else { if (title) title.textContent = "Облачная зависимость под видом локальности"; if (summary) summary.textContent = "Система не обеспечивает сохранение версии, отсутствие журнала, переносимость и независимое восстановление."; }
    const report = ["ПРОВЕРКА ЛОКАЛЬНОГО ИИ", "", `ПРОЙДЕНО: ${passed} ИЗ ${checks.length}`, "", "НЕЗАКРЫТЫЕ РУБЕЖИ", ...(missing.length ? missing.map(x => `— ${x}`) : ["— Не зафиксированы."]), "", "ЛОКАЛЬНОЕ ИСПОЛНЕНИЕ — ТОЛЬКО НАЧАЛО СУВЕРЕНИТЕТА."].join("\n");
    const out = $("#local-ai-output"); if (out) out.value = report;
    return report;
  };
  localForm?.addEventListener("change", localReport);
  localForm?.addEventListener("submit", e => { e.preventDefault(); localReport(); $("#local-ai-output")?.focus(); });
  $("#local-ai-copy")?.addEventListener("click", () => copyText(localReport()));
  $("#local-ai-reset")?.addEventListener("click", () => { localForm?.reset(); localReport(); });
  localReport();

  const anonForm = $("#anonymous-inquiry-test");
  const anonReport = () => {
    if (!anonForm) return "";
    const fields = $$("[data-anon-question]", anonForm);
    let points = 0, answered = 0;
    const gaps = [];
    const lines = ["ПРОВЕРКА НЕОБХОДИМОСТИ ИДЕНТИФИКАЦИОННОГО ШЛЮЗА", ""];
    fields.forEach((field, i) => {
      const checked = $("input:checked", field);
      const value = checked ? Number(checked.value) : 0;
      const title = $("legend strong", field)?.textContent.trim() || `Вопрос ${i+1}`;
      points += value; if (checked) answered += 1;
      if (value < 2) gaps.push(title);
      lines.push(`${String(i+1).padStart(2,"0")}. ${title}`, `Ответ: ${checked?.dataset.label || "неизвестно"}.`, "");
    });
    const score = $("#anon-score span"); if (score) score.textContent = String(points);
    const title = $("#anon-title"), summary = $("#anon-summary");
    if (answered < fields.length) { if (title) title.textContent = "Тест не завершён"; if (summary) summary.textContent = `Заполнено ${answered} из ${fields.length}. Незаполненное условие не считается доказанной минимизацией.`; }
    else if (points >= 18) { if (title) title.textContent = "Проверяется нужный факт, а не вся личность"; if (summary) summary.textContent = "Архитектура близка к разделённой и минимальной. Проверьте несвязываемость между службами и реальное удаление."; }
    else if (points >= 13) { if (title) title.textContent = "Избыточная связь остаётся"; if (summary) summary.textContent = "Часть проверки минимизирована, но устойчивый идентификатор, вторичное применение или раскрытие содержания создают атрибуционный след."; }
    else { if (title) title.textContent = "Шлюз личности вместо проверки права"; if (summary) summary.textContent = "Система собирает больше, чем требуется для доступа, и создаёт долговременную связь между личностью и интеллектуальной деятельностью."; }
    lines.push(`ИТОГ: ${points}/20`, `ЗАПОЛНЕНО: ${answered}/${fields.length}`, "", "НЕЗАКРЫТЫЕ УСЛОВИЯ", ...(gaps.length ? gaps.map(x => `— ${x}`) : ["— Не зафиксированы."]), "", "ДОКАЖИ НУЖНЫЙ ФАКТ, А НЕ ВСЮ ЛИЧНОСТЬ.");
    const report = lines.join("\n"); const out = $("#anon-output"); if (out) out.value = report; return report;
  };
  anonForm?.addEventListener("change", anonReport);
  anonForm?.addEventListener("submit", e => { e.preventDefault(); anonReport(); $("#anon-output")?.focus(); });
  $("#anon-copy")?.addEventListener("click", () => copyText(anonReport()));
  $("#anon-reset")?.addEventListener("click", () => { anonForm?.reset(); anonReport(); });
  anonReport();

  const domainForm = $("#domain-check");
  domainForm?.addEventListener("submit", e => {
    e.preventDefault();
    const raw = $("#domain-input")?.value.trim() || "";
    const normalized = raw.replace(/\/+$/, "/");
    const title = $("#domain-title"), summary = $("#domain-summary");
    if (raw === "война.com") { if (title) title.textContent = "Правильное публичное имя"; if (summary) summary.textContent = "Имя написано строчными буквами, одной строкой, с точным латинским окончанием .com."; }
    else if (normalized === "https://xn--80advqd.com/") { if (title) title.textContent = "Правильный канонический адрес"; if (summary) summary.textContent = "Техническая сетевая форма совпадает с каноническим адресом проекта."; }
    else { if (title) title.textContent = "Строка не совпадает с каноном"; if (summary) summary.textContent = "Проверьте регистр, сцепление имени, доменное окончание и техническую форму."; }
  });
  $("#domain-reset")?.addEventListener("click", () => { domainForm?.reset(); const t=$("#domain-title"), s=$("#domain-summary"); if(t)t.textContent="Введите строку"; if(s)s.textContent="Локальная проверка формы не доказывает состояние системы доменных имён, сертификата или размещения."; });
})();
