(function () {
  'use strict';

  if (window.controllerId !== 'conversation' || window.actionId !== 'index') return;

  const ROOT_CLASS = 'psych-talks-ui';
  const READY_CLASS = 'psych-talks-ui--ready';

  const qs = (s, r = document) => r.querySelector(s);
  const qsa = (s, r = document) => Array.from(r.querySelectorAll(s));

  function isVisible(el) {
    if (!el) return false;
    const style = getComputedStyle(el);
    if (style.display === 'none' || style.visibility === 'hidden') return false;
    const rect = el.getBoundingClientRect();
    return rect.width > 0 && rect.height > 0;
  }

  function getSidebarRight() {
    if (matchMedia('(max-width: 760px)').matches) return 0;

    const candidates = [
      qs('#gcAccountUserMenu .gc-account-leftbar'),
      qs('.gc-account-leftbar'),
      qs('#gcAccountUserMenu'),
      qs('.theme-left-panel'),
      qs('#mainMenuForOldSite')
    ].filter(Boolean);

    let right = 0;

    candidates.forEach(el => {
      if (!isVisible(el)) return;

      const rect = el.getBoundingClientRect();

      /*
       * Берём только элементы, действительно примыкающие к левому краю.
       * Так раскрывающиеся подменю не смогут внезапно сдвинуть весь чат.
       */
      if (rect.left <= 12 && rect.right > right && rect.width <= 360) {
        right = rect.right;
      }
    });

    /*
     * Штатная страница GetCourse рассчитывает на 70px.
     * Если меню ещё не успело смонтироваться, сохраняем безопасный fallback.
     */
    return Math.max(70, Math.round(right || 0));
  }

  function syncSidebarOffset() {
    const value = getSidebarRight();
    document.documentElement.style.setProperty(
      '--psych-talks-sidebar-offset',
      value + 'px'
    );
  }

  function markWidget() {
    const windows = qsa('.talks-widget-window');

    if (!windows.length) return false;

    windows.forEach(win => {
      win.classList.add('psych-talks-window');

      const widget =
        qs('.talks-widget', win) ||
        qs('.conversation-widget', win) ||
        win.firstElementChild;

      if (widget) widget.classList.add('psych-talks-widget');

      qsa('input[type="text"], input[type="search"], textarea', win).forEach(el => {
        el.classList.add('psych-talks-field');
      });

      qsa('button, .btn', win).forEach(el => {
        if (/отправ|созда|напис|ответ/i.test((el.textContent || '').trim())) {
          el.classList.add('psych-talks-primary-action');
        }
      });
    });

    document.body.classList.add(READY_CLASS);
    return true;
  }

  function normalizeDynamicUi() {
    markWidget();

    qsa('.talks-widget-window .user-profile-image').forEach(img => {
      img.classList.add('psych-talks-avatar');
    });

    qsa(
      '.talks-widget-window .comment, ' +
      '.talks-widget-window .conversation-message, ' +
      '.talks-widget-window .message'
    ).forEach(el => el.classList.add('psych-talks-message'));
  }

  function init() {
    document.body.classList.add(ROOT_CLASS);

    syncSidebarOffset();
    normalizeDynamicUi();

    let raf = 0;

    const schedule = () => {
      if (raf) return;
      raf = requestAnimationFrame(() => {
        raf = 0;
        syncSidebarOffset();
        normalizeDynamicUi();
      });
    };

    const observer = new MutationObserver(schedule);
    observer.observe(document.body, {
      childList: true,
      subtree: true
    });

    window.addEventListener('resize', schedule, { passive: true });
    window.addEventListener('orientationchange', schedule, { passive: true });

    if (window.ResizeObserver) {
      const ro = new ResizeObserver(schedule);

      const tryObserveSidebar = () => {
        const sidebar =
          qs('#gcAccountUserMenu .gc-account-leftbar') ||
          qs('.gc-account-leftbar') ||
          qs('#gcAccountUserMenu');

        if (sidebar) ro.observe(sidebar);
      };

      tryObserveSidebar();
      setTimeout(tryObserveSidebar, 300);
      setTimeout(tryObserveSidebar, 1200);
    }

    /*
     * Виджет GetCourse монтируется асинхронно.
     * Несколько лёгких проходов после загрузки закрывают этот сценарий
     * без постоянного setInterval.
     */
    [100, 300, 700, 1400, 2500].forEach(delay => {
      setTimeout(schedule, delay);
    });
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init, { once: true });
  } else {
    init();
  }
})();
