(function () {
  'use strict';

  function onReady(fn) {
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', fn);
    } else {
      fn();
    }
  }

  // 1. Чистим мусорные маркеры в списках (• · ▪ *)
  function normalizeLists(root) {
    root.querySelectorAll('.post li').forEach(function (li) {
      li.innerHTML = li.innerHTML.replace(/^\s*[•·▪*]\s*/, '');
    });
  }

  // 2. Удаляем дублирующиеся секции (по тексту)
  function dedupeSections(root) {
    var seen = new Set();
    root.querySelectorAll('.post__section').forEach(function (section) {
      var text = section.textContent || '';
      var key = text.trim().replace(/\s+/g, ' ').slice(0, 500);
      if (!key || key.length < 40) return; // очень короткие блоки не трогаем

      if (seen.has(key)) {
        section.remove();
      } else {
        seen.add(key);
      }
    });
  }

  // 3. TOC: плавный скролл + подсветка активного пункта (при желании можно добавить IntersectionObserver)
  function enhanceToc(root) {
    var toc = root.querySelector('.post__toc');
    if (!toc) return;

    var links = Array.prototype.slice.call(
      toc.querySelectorAll('a[href^="#"]')
    );
    if (!links.length) return;

    links.forEach(function (link) {
      var href = link.getAttribute('href');
      var id = href && href.slice(1);
      if (!id) return;
      var target = document.getElementById(id);
      if (!target) return;

      link.addEventListener('click', function (e) {
        e.preventDefault();
        var offset = 96; // под фикс-хедер
        var rect = target.getBoundingClientRect();
        var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
        var y = rect.top + scrollTop - offset;

        window.scrollTo({
          top: y,
          behavior: 'smooth'
        });
      });
    });

    // Подсветка активного заголовка при скролле
    var headings = Array.prototype.slice.call(
      root.querySelectorAll('h2[id], h3[id]')
    );
    if (!headings.length) return;

    var idToLink = {};
    links.forEach(function (link) {
      var href = link.getAttribute('href');
      var id = href && href.slice(1);
      if (id) idToLink[id] = link;
    });

    var activeId = null;

    function setActive(id) {
      if (activeId === id) return;
      activeId = id;
      links.forEach(function (link) {
        link.classList.remove('toc-link--active');
      });
      var l = idToLink[id];
      if (l) l.classList.add('toc-link--active');
    }

    if ('IntersectionObserver' in window) {
      var observer = new IntersectionObserver(function (entries) {
        entries.forEach(function (entry) {
          if (!entry.isIntersecting) return;
          var id = entry.target.id;
          if (id && idToLink[id]) {
            setActive(id);
          }
        });
      }, {
        root: null,
        rootMargin: '-45% 0px -50% 0px',
        threshold: 0.1
      });

      headings.forEach(function (h) {
        observer.observe(h);
      });
    }
  }

  // 4. FAQ (details/summary) — aria-улучшения
  function enhanceFaq(root) {
    var faq = root.querySelector('.faq');
    if (!faq) return;

    faq.querySelectorAll('.faq__item').forEach(function (item) {
      var summary = item.querySelector('summary');
      if (!summary) return;

      summary.setAttribute('role', 'button');
      summary.setAttribute('aria-expanded', item.hasAttribute('open') ? 'true' : 'false');

      summary.addEventListener('click', function () {
        setTimeout(function () {
          summary.setAttribute(
            'aria-expanded',
            item.hasAttribute('open') ? 'true' : 'false'
          );
        }, 0);
      });
    });
  }

  onReady(function () {
    var post = document.querySelector('.post');
    if (!post) return;

    normalizeLists(post);
    dedupeSections(post);
    enhanceToc(post);
    enhanceFaq(post);
  });
})();