(function(){
  function $(sel){ return document.querySelector(sel); }
  function createLogItem(message){
    const item = document.createElement('div');
    item.className = 'progress-log-item';
    item.textContent = message;
    return item;
  }

  document.addEventListener('DOMContentLoaded', function(){
    const overlay = $('#progressOverlay');
    if (!overlay) return;

    const titleEl = $('#progressTitle');
    const messageEl = $('#progressMessage');
    const percentEl = $('#progressPercent');
    const fillEl = $('#progressBarFill');
    const logEl = $('#progressLog');
    const closeBtn = $('#progressClose');

    function setProgress(data){
      if (typeof data.title === 'string' && data.title.trim()) titleEl.textContent = data.title;
      if (typeof data.message === 'string') messageEl.textContent = data.message;
      if (typeof data.progress === 'number') {
        const value = Math.max(0, Math.min(100, data.progress));
        percentEl.textContent = value + '%';
        fillEl.style.width = value + '%';
      }
      if (typeof data.log === 'string' && data.log.trim()) {
        logEl.appendChild(createLogItem(data.log));
        logEl.scrollTop = logEl.scrollHeight;
      }
      if (data.type === 'error') {
        closeBtn.classList.add('is-visible');
        closeBtn.onclick = function(){ window.location.reload(); };
      }
    }

    function showOverlay(title){
      titleEl.textContent = title || 'در حال انجام عملیات';
      messageEl.textContent = 'لطفاً صبر کنید...';
      percentEl.textContent = '0%';
      fillEl.style.width = '0%';
      logEl.innerHTML = '';
      closeBtn.classList.remove('is-visible');
      overlay.classList.add('is-visible');
      document.body.style.overflow = 'hidden';
    }

    function hideOverlay(){
      overlay.classList.remove('is-visible');
      document.body.style.overflow = '';
    }

    closeBtn.addEventListener('click', hideOverlay);

    document.querySelectorAll('form.async-task-form').forEach(function(form){
      form.addEventListener('submit', async function(ev){
        if (!window.fetch || !window.ReadableStream) return;
        ev.preventDefault();

        const task = form.dataset.task;
        const returnPage = form.dataset.returnPage || 'dashboard';
        const progressTitle = form.dataset.progressTitle || 'در حال انجام عملیات';
        if (!task) {
          form.submit();
          return;
        }

        showOverlay(progressTitle);
        setProgress({progress: 3, message: 'درخواست ارسال شد. اجرای عملیات شروع می‌شود...', log: 'شروع عملیات'});

        try {
          const response = await fetch('index.php?page=task-runner&task=' + encodeURIComponent(task) + '&return_page=' + encodeURIComponent(returnPage), {
            method: 'POST',
            body: new FormData(form),
            headers: {'X-Requested-With': 'XMLHttpRequest'}
          });

          if (!response.ok || !response.body) {
            throw new Error('پاسخ معتبر از سرور دریافت نشد.');
          }

          const reader = response.body.getReader();
          const decoder = new TextDecoder('utf-8');
          let buffer = '';

          while (true) {
            const result = await reader.read();
            if (result.done) break;
            buffer += decoder.decode(result.value, {stream: true});
            const lines = buffer.split(/\r?\n/);
            buffer = lines.pop() || '';
            lines.forEach(function(line){
              const trimmed = line.trim();
              if (!trimmed) return;
              try {
                const data = JSON.parse(trimmed);
                setProgress(data);
                if (data.type === 'complete' && data.redirect) {
                  setTimeout(function(){ window.location.href = data.redirect; }, 900);
                }
              } catch (err) {
                setProgress({type:'error', message:'خواندن وضعیت عملیات ناموفق بود.', log: trimmed});
              }
            });
          }
        } catch (err) {
          setProgress({type:'error', progress: 100, message: err.message || 'خطا در اجرای عملیات', log: 'اجرای عملیات با خطا متوقف شد.'});
        }
      });
    });
  });
})();
