/* Celena Admin — AI helpers.
 * Биндит data-ai-task="task_name" data-ai-target="#selector" на кнопку.
 * data-ai-args-from='{"title":"#title","content":"#body"}' — откуда брать аргументы.
 */
(function () {
  'use strict';
  var meta = document.querySelector('meta[name="csrf-token"]');
  var CSRF = meta ? meta.content : '';

  function say(msg, type) {
    if (window.Celena && window.Celena.alert) window.Celena.alert(msg, { type: type || 'info' });
    else alert(msg);
  }

  function val(sel) {
    if (!sel) return '';
    var el = document.querySelector(sel);
    if (!el) return '';
    return (el.value !== undefined) ? el.value : el.textContent || '';
  }

  function setVal(sel, v) {
    if (!sel) return;
    var el = document.querySelector(sel);
    if (!el) return;
    if (el.value !== undefined) el.value = v;
    else el.textContent = v;
    // celenaEditor: обновить видимый contenteditable-редактор.
    // В режиме individualToolbar между textarea и редактором вставлен .celenaEditorToolbar,
    // поэтому ищем ближайший следующий .celenaEditor, а не строго nextElementSibling.
    if (el.hasAttribute && el.hasAttribute('data-celena-editor')) {
      var ed = el.nextElementSibling;
      while (ed && !(ed.classList && ed.classList.contains('celenaEditor'))) ed = ed.nextElementSibling;
      if (ed) ed.innerHTML = v;
    }
    // триггерим событие, если что-то слушает
    el.dispatchEvent(new Event('input', { bubbles: true }));
    el.dispatchEvent(new Event('change', { bubbles: true }));
  }

  function run(btn) {
    var task = btn.getAttribute('data-ai-task');
    var argsFrom = btn.getAttribute('data-ai-args-from');
    var target = btn.getAttribute('data-ai-target');
    var applyFn = btn.getAttribute('data-ai-apply') || 'set';
    var args = {};
    if (argsFrom) {
      try {
        var map = JSON.parse(argsFrom);
        for (var k in map) args[k] = val(map[k]);
      } catch (e) { /* ignore */ }
    }
    btn.disabled = true;
    var orig = btn.textContent;
    btn.textContent = '✨ думает...';
    fetch('/admin/api/ai/run', {
      method: 'POST',
      credentials: 'same-origin',
      headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': CSRF },
      body: JSON.stringify({ task: task, args: args, _csrf: CSRF })
    })
      .then(function (r) { return r.json(); })
      .then(function (j) {
        if (!j.ok) { say('ИИ: ' + (j.error || 'ошибка'), 'error'); return; }
        var res = String(j.result || '').trim();
        if (task === 'generate_meta') {
          try {
            var obj = JSON.parse(res.replace(/^```(?:json)?|```$/g, '').trim());
            if (obj.seo_title) setVal('[name="seo_title"]', obj.seo_title);
            if (obj.seo_description) setVal('[name="seo_description"]', obj.seo_description);
            if (obj.keywords) setVal('[name="seo_keywords"]', obj.keywords);
            say('SEO-поля заполнены.', 'success');
          } catch (e) { say('ИИ вернул не JSON: ' + res, 'error'); }
        } else if (applyFn === 'append' && target) {
          var el = document.querySelector(target);
          if (el) el.value = (el.value ? el.value + '\n\n' : '') + res;
        } else {
          setVal(target, res);
        }
      })
      .catch(function (e) { say('Сеть: ' + e.message, 'error'); })
      .finally(function () {
        btn.disabled = false;
        btn.textContent = orig;
      });
  }

  document.addEventListener('click', function (e) {
    var btn = e.target.closest('[data-ai-task]');
    if (!btn) return;
    e.preventDefault();
    run(btn);
  });
})();
