(() => {
  'use strict';
  const хранилище = window.localStorage;
  const скачать = (имя, содержимое, тип = 'application/json;charset=utf-8') => {
    const ссылка = document.createElement('a');
    ссылка.href = URL.createObjectURL(new Blob([содержимое], {type: тип}));
    ссылка.download = имя;
    document.body.appendChild(ссылка); ссылка.click(); ссылка.remove();
    setTimeout(() => URL.revokeObjectURL(ссылка.href), 500);
  };
  const прочитать = (ключ, запас = []) => { try { return JSON.parse(хранилище.getItem(ключ) || JSON.stringify(запас)); } catch (_) { return запас; } };
  const записать = (ключ, значение) => хранилище.setItem(ключ, JSON.stringify(значение));
  const безопасно = (текст) => String(текст ?? '').replace(/[&<>"']/g, знак => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[знак]));
  const формаВДанные = (форма) => {
    const данные = {};
    new FormData(форма).forEach((значение, ключ) => {
      if (ключ === 'различия') { (данные[ключ] ||= []).push(значение); }
      else данные[ключ] = значение;
    });
    return данные;
  };
  const now = () => new Date().toISOString();

  const права = document.querySelectorAll('.право-карта');
  if (права.length) {
    const ключ = 'война-исполнение-хартии-4-1';
    const сохранено = прочитать(ключ, {});
    const обновить = () => {
      const итог = {'не проверено':0,'подтверждено':0,'частично':0,'провалено':0,'не применимо':0};
      права.forEach(карта => {
        const номер = карта.dataset.right;
        const состояние = карта.querySelector('.состояние-права');
        const доказательство = карта.querySelector('.доказательство-права');
        if (сохранено[номер]) { состояние.value = сохранено[номер].состояние || 'не проверено'; доказательство.value = сохранено[номер].доказательство || ''; }
        итог[состояние.value] = (итог[состояние.value] || 0) + 1;
      });
      const узел = document.querySelector('#сводка-счётчики');
      if (узел) узел.innerHTML = Object.entries(итог).map(([имя, число]) => `<div class="сводка-ячейка"><strong>${число}</strong><span>${безопасно(имя)}</span></div>`).join('');
    };
    права.forEach(карта => карта.addEventListener('input', () => {
      const номер = карта.dataset.right;
      сохранено[номер] = {состояние: карта.querySelector('.состояние-права').value, доказательство: карта.querySelector('.доказательство-права').value, обновлено: now()};
      записать(ключ, сохранено); обновить();
    }));
    document.querySelector('#поиск-прав')?.addEventListener('input', событие => {
      const запрос = событие.target.value.trim().toLowerCase();
      права.forEach(карта => карта.hidden = запрос && !карта.dataset.search.includes(запрос));
    });
    document.querySelector('[data-action="экспорт-прав"]')?.addEventListener('click', () => скачать('ведомость-исполнения-хартии-4.4.0-wip.json', JSON.stringify({редакция:'4.4.0-wip',создано:now(),публичное_имя:'война.com',права:сохранено}, null, 2)));
    document.querySelector('[data-action="сброс-прав"]')?.addEventListener('click', () => { if (confirm('Удалить локальные отметки исполнения Хартии?')) { хранилище.removeItem(ключ); location.reload(); } });
    обновить();
  }

  const формаСравнения = document.querySelector('#форма-сравнения');
  if (формаСравнения) {
    const ключ = 'война-сравнения-систем-4-1';
    let журнал = прочитать(ключ, []);
    const показать = () => {
      const узел = document.querySelector('#журнал-сравнений');
      узел.innerHTML = журнал.length ? журнал.slice().reverse().map(з => `<article class="журнал-запись"><h3>${безопасно(з.код_серии)} · ${безопасно(з.дата)}</h3><p><strong>${безопасно(з.система_а)} ${безопасно(з.версия_а)}</strong> ↔ <strong>${безопасно(з.система_б)} ${безопасно(з.версия_б)}</strong></p><p>Переменная: ${безопасно(з.переменная)}</p><p>Различия: ${безопасно((з.различия || []).join(', ') || 'не отмечены')}</p><p>Предел вывода: ${безопасно(з.предел)}</p></article>`).join('') : '<p>Локальных наблюдений пока нет.</p>';
    };
    формаСравнения.addEventListener('submit', событие => { событие.preventDefault(); const данные = формаВДанные(формаСравнения); данные.создано = now(); журнал.push(данные); записать(ключ, журнал); формаСравнения.reset(); показать(); });
    document.querySelector('[data-action="экспорт-сравнений"]')?.addEventListener('click', () => скачать('журнал-сравнения-систем-4.4.0-wip.json', JSON.stringify({редакция:'4.4.0-wip',создано:now(),наблюдения:журнал}, null, 2)));
    document.querySelector('[data-action="сброс-сравнений"]')?.addEventListener('click', () => { if (confirm('Удалить локальный журнал сравнений?')) { журнал=[]; записать(ключ, журнал); показать(); } });
    показать();
  }

  const формаОбжалования = document.querySelector('#форма-обжалования');
  if (формаОбжалования) {
    const результат = document.querySelector('#результат-обжалования');
    const собрать = () => {
      const д = формаВДанные(формаОбжалования);
      const текст = `ТЕМА: ТРЕБОВАНИЕ УВЕДОМЛЕНИЯ, ПРИЧИН, ДОКАЗАТЕЛЬСТВ, ПЕРЕСМОТРА И ИСПРАВЛЕНИЯ\n\nОрганизация: ${д.организация || '[не указано]'}\nДата решения: ${д.дата || '[не указано]'}\nНомер дела или учётной записи: ${д.номер || '[не указано]'}\n\nОСПАРИВАЕМОЕ РЕШЕНИЕ\n${д.решение || ''}\n\nМАТЕРИАЛЬНОЕ ВЛИЯНИЕ\n${д.влияние || ''}\n\nИЗВЕСТНАЯ СИСТЕМА ИЛИ РАБОЧИЙ ПРОЦЕСС\n${д.система || 'Неизвестно. Прошу установить и назвать.'}\n\n1. УВЕДОМЛЕНИЕ\nСообщите, влияли ли на решение алгоритм, оценка, ранжирование, прогнозная модель, генеративная система или автоматизированный рабочий процесс. Назовите систему, версию, ответственную структуру, дату и её точную роль.\n\n2. ПРИЧИНЫ\nПредоставьте понятное объяснение существенных факторов, правил, целей и порогов, повлиявших на результат.\n\n3. ДОКАЗАТЕЛЬСТВА\nНазовите исходные записи, данные, выводы, источники и исправляемые поля. Сохраните относящиеся к делу журналы и версии.\n\n4. ПЕРЕСМОТР ЧЕЛОВЕКОМ\nНазовите полномочного проверяющего, способного отменить или изменить решение, процедуру, срок и ожидаемое время ответа.\n\n5. ИСПРАВЛЕНИЕ И ВОССТАНОВЛЕНИЕ\nВозможная ошибка: ${д.ошибка || 'Требуется раскрытие записи для проверки.'}\nТребуемое исправление: ${д.исправление || ''}\nИсправление должно затронуть исходную запись, нижележащие системы и последующие решения.\n\nСрок ответа: ${д.срок || '[указать применимый срок]'}\n`;
      результат.textContent = текст; return текст;
    };
    формаОбжалования.addEventListener('submit', событие => { событие.preventDefault(); собрать(); });
    document.querySelector('[data-action="копировать-обжалование"]')?.addEventListener('click', async () => { await navigator.clipboard.writeText(собрать()); });
    document.querySelector('[data-action="сохранить-обжалование"]')?.addEventListener('click', () => скачать('пакет-обжалования.txt', собрать(), 'text/plain;charset=utf-8'));
  }

  const формаИзменения = document.querySelector('#форма-изменения');
  if (формаИзменения) {
    const ключ = 'война-реестр-изменений-4-1';
    let записи = прочитать(ключ, []);
    const показать = () => { const узел=document.querySelector('#журнал-изменений'); узел.innerHTML = записи.length ? записи.slice().reverse().map(з => `<article class="журнал-запись"><h3>${безопасно(з.система)} · ${безопасно(з.версия)} · ${безопасно(з.дата)}</h3><p>${безопасно(з.тип)} · ${безопасно(з.регион)} · ${безопасно(з.уверенность)}</p><p>${безопасно(з.изменение)}</p><p>Условие опровержения: ${безопасно(з.опровержение)}</p></article>`).join('') : '<p>Локальных записей пока нет.</p>'; };
    формаИзменения.addEventListener('submit', событие => { событие.preventDefault(); const данные=формаВДанные(формаИзменения); данные.создано=now(); записи.push(данные); записать(ключ, записи); формаИзменения.reset(); показать(); });
    document.querySelector('[data-action="экспорт-изменений"]')?.addEventListener('click', () => скачать('реестр-изменений-систем-4.4.0-wip.json', JSON.stringify({редакция:'4.4.0-wip',создано:now(),записи}, null, 2)));
    document.querySelector('[data-action="сброс-изменений"]')?.addEventListener('click', () => { if(confirm('Удалить локальный реестр изменений?')){записи=[];записать(ключ,записи);показать();} });
    показать();
  }

  const файлы = document.querySelector('#файлы-свидетельств');
  if (файлы) {
    let отчётТекст = 'Свидетельства не загружены. Состояние: незавершённый выпуск.';
    const узел = document.querySelector('#отчёт-свидетельств');
    document.querySelector('[data-action="проверить-свидетельства"]')?.addEventListener('click', async () => {
      const ожидаются = new Set(['ВР-01','ВР-02','ВР-03','ВР-04']);
      const найдено = new Map(); const ошибки=[];
      for (const файл of файлы.files) {
        try {
          if(файл.size>1048576)throw Error('Размер превышает 1 МиБ.');const запись = JSON.parse(await файл.text());
          const код = запись.рубеж || запись.код_рубежа;
          if (!ожидаются.has(код)) ошибки.push(`${файл.name}: неизвестный код рубежа.`);
          else if (найдено.has(код)) ошибки.push(`${файл.name}: повтор кода ${код}.`);
          else {
            const требуются = ['время_наблюдения','результат','ша256_приложения','отпечаток_записи','подпись','ша256_ключа','адрес_публикации_ключа','ша256_манифеста_выпуска'];
            if (запись.формат!=='война-свидетельство-владельца-2'||запись.редакция!=='4.4.0-wip') ошибки.push(`${файл.name}: неизвестная схема или другая редакция выпуска.`);
            const пустые = требуются.filter(ключ => !запись[ключ]);
            if (пустые.length) ошибки.push(`${файл.name}: отсутствуют поля: ${пустые.join(', ')}.`);
            найдено.set(код, запись);
          }
        } catch (ошибка) { ошибки.push(`${файл.name}: файл не разобран.`); }
      }
      const отсутствуют=[...ожидаются].filter(код=>!найдено.has(код));
      const полностью = !ошибки.length && !отсутствуют.length && найдено.size===4;
      отчётТекст = `ПРЕДВАРИТЕЛЬНАЯ ПРОВЕРКА КОМПЛЕКТА\nДата: ${now()}\nНайдено рубежей: ${найдено.size} из 4\nОтсутствуют: ${отсутствуют.join(', ') || 'нет'}\nОшибки структуры: ${ошибки.length}\n${ошибки.map(о=>'— '+о).join('\n')}\n\nРезультат: ${полностью ? 'структурно полный комплект; требуется криптографическая проверка автономным сценарием' : 'незавершённый выпуск; состояние не меняется'}\n`;
      узел.textContent = отчётТекст;
    });
    document.querySelector('[data-action="сохранить-отчёт-свидетельств"]')?.addEventListener('click', () => скачать('отчёт-предварительной-проверки-свидетельств.txt', отчётТекст, 'text/plain;charset=utf-8'));
  }
})();
