// ═══ Batch Approve Page ═══
async function batchApprovePage() {
  const pendingCodes = currentProducts.filter(p => p.desc_status === 0).map(p => p.internal_ref_code);
  if (pendingCodes.length === 0) {
    alert("Trang hiện tại không có sản phẩm nào 'Chờ duyệt' để duyệt hàng loạt.");
    return;
  }
  if (!confirm(`Xác nhận duyệt hàng loạt ${pendingCodes.length} sản phẩm đang chờ duyệt ở trang này?`)) return;

  const btn = document.getElementById('btnApprovePage');
  const ogText = btn.innerHTML;
  btn.innerHTML = '<div class="spinner-sm"></div> Đang tải...';
  btn.disabled = true;

  try {
    const promises = pendingCodes.map(code => 
      fetch(`${API}/approve`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ internal_ref_code: code, status: 1 }),
      })
    );
    await Promise.all(promises);
    alert(`✅ Đã duyệt thành công ${pendingCodes.length} sản phẩm.`);
    loadProducts();
    loadOverview();
  } catch (e) {
    alert('Lỗi duyệt hàng loạt: ' + e.message);
  } finally {
    btn.innerHTML = ogText;
    btn.disabled = false;
  }
}

// ═══ Approve ALL (toàn bộ chờ duyệt) ═══
async function approveAll() {
  if (!confirm('⚠️ Xác nhận DUYỆT TOÀN BỘ tất cả mô tả đang ở trạng thái "Chờ duyệt"?')) return;

  const btn = document.getElementById('btnApproveAll');
  const ogText = btn.innerHTML;
  btn.innerHTML = '<div class="spinner-sm"></div> Đang duyệt...';
  btn.disabled = true;

  try {
    const resp = await fetch(`${API}/approve-all`, { method: 'POST' });
    const data = await resp.json();
    if (data.status === 'success') {
      alert(`✅ ${data.message}`);
      loadProducts();
      loadOverview();
    } else {
      alert('❌ Lỗi: ' + (data.message || 'Unknown error'));
    }
  } catch (e) {
    alert('❌ Lỗi: ' + e.message);
  } finally {
    btn.innerHTML = ogText;
    btn.disabled = false;
  }
}

async function backfillMissingCleanDescriptions() {
  const summaryRes = await fetch(`${API}/clean-missing-summary`);
  const summary = await summaryRes.json();
  if (summary.status !== 'success') {
    alert('Không lấy được thống kê clean description.');
    return;
  }

  const missing = Number(summary.missing_clean_desc || 0);
  if (missing <= 0) {
    alert('Không có sản phẩm nào thiếu clean description chuẩn.');
    return;
  }

  if (!confirm(`Phát hiện ${missing} sản phẩm đang thiếu hoặc lỗi format clean description.\n\nBấm OK để render lại hàng loạt theo format chuẩn từ description_data hiện có.`)) {
    return;
  }

  const btn = document.getElementById('btnBackfillClean');
  const oldText = btn.innerHTML;
  btn.innerHTML = '<div class="spinner-sm"></div> Đang render...';
  btn.disabled = true;

  try {
    const res = await fetch(`${API}/backfill-clean-description`, { method: 'POST' });
    const data = await res.json();
    if (data.status !== 'success') throw new Error(data.message || 'Unknown error');
    alert(`✅ ${data.message}\nCòn thiếu: ${data.remaining_missing_clean_desc}`);
    loadOverview();
    loadProducts();
  } catch (e) {
    alert('Lỗi backfill clean description: ' + e.message);
  } finally {
    btn.innerHTML = oldText;
    btn.disabled = false;
  }
}
async function batchGeneratePage() {
  const missingCodes = currentProducts.filter(p => p.desc_status === -1).map(p => p.internal_ref_code);
  if (missingCodes.length === 0) {
    alert("Trang hiện tại không có sản phẩm nào 'Chưa có mô tả'. Vui lòng chuyển trang hoặc đổi bộ lọc.");
    return;
  }

  if (!confirm(`Phát hiện ${missingCodes.length} sản phẩm thiếu mô tả ở trang này.\\nĐưa vào hàng đợi tự động sinh AI (Chạy ngầm)?`)) return;

  const btn = document.getElementById('btnBatch');
  const ogText = btn.innerHTML;
  btn.innerHTML = '<div class="spinner-sm"></div> Đang gửi...';
  btn.disabled = true;

  try {
    const res = await fetch(`${API}/batch-generate`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ internal_ref_codes: missingCodes })
    });
    const data = await res.json();
    if (data.status === 'error') throw new Error(data.message);

    alert(data.message);
    startBatchPolling();
    // Refresh table immediately to not click again
    loadProducts();
  } catch (e) {
    alert('Lỗi chạy hàng loạt: ' + e.message);
  } finally {
    btn.innerHTML = ogText;
    btn.disabled = false;
  }
}

// ═══ NATIVE BULK AI EDIT ═══
let currentBulkAiTarget = [];
let currentBulkLineTarget = "";

function openNativeBulkAiModal(singleSku = null) {
  if (singleSku) {
      currentBulkAiTarget = [singleSku];
      const p = currentProducts.find(x => x.internal_ref_code === singleSku);
      currentBulkLineTarget = p ? p.product_line_vn : '';
      
      document.getElementById('lblBulkAiCount').innerHTML = `<strong>1 sản phẩm</strong> (SKU: ${singleSku})`;
      
      let lineOption = '';
      if (currentBulkLineTarget) {
          lineOption = `<label style="cursor:pointer; display:block; margin-top:6px;"><input type="radio" name="scopeTarget" value="line"> Áp dụng cho TẤT CẢ sản phẩm thuộc dòng: <strong>${currentBulkLineTarget}</strong></label>`;
      }
      
      document.getElementById('scopeContainer').innerHTML = `
        <div style="background:#eff6ff; padding:12px; border-radius:6px; border:1px solid #bfdbfe; margin-bottom:15px;">
           <div style="font-weight:bold; font-size:13px; margin-bottom:8px; color:#1e40af;">🎯 Phạm vi áp dụng:</div>
           <label style="cursor:pointer; display:block;"><input type="radio" name="scopeTarget" value="sku" checked> Chỉ sửa DUY NHẤT 1 mã: <strong>${singleSku}</strong></label>
           ${lineOption}
        </div>
      `;
  } else {
      if (!currentProducts || currentProducts.length === 0) {
        alert("Trang hiện tại không có sản phẩm nào để xử lý!");
        return;
      }
      currentBulkAiTarget = currentProducts.map(p => p.internal_ref_code);
      currentBulkLineTarget = "";
      document.getElementById('lblBulkAiCount').innerHTML = `<strong>${currentBulkAiTarget.length} sản phẩm</strong> đang hiển thị trên trang này`;
      document.getElementById('scopeContainer').innerHTML = ''; // Hide scope container for page-level bulk
  }

  // Try to load dynamic fields if possible, or fallback to default html opts
  fetch('/api/bulk/fields').then(r => r.json()).then(d => {
      if (d.status === 'success') {
          const sel = document.getElementById('nativeBulkAiField');
          sel.innerHTML = '';
          for (const [key, label] of Object.entries(d.fields)) {
              if (key === 'huong_dan_size') sel.innerHTML += `<option value="${key}" selected>${label}</option>`;
              else sel.innerHTML += `<option value="${key}">${label}</option>`;
          }
      }
  }).catch(() => {});
  
  document.getElementById('nativeBulkAiModal').style.display = 'flex';
}

async function execNativeBulkAi() {
  const field = document.getElementById('nativeBulkAiField').value;
  const mode = document.getElementById('nativeBulkAiMode').value;
  const instruction = document.getElementById('nativeBulkAiInstruction').value.trim();

  if (!instruction) {
    alert("⚠️ Vui lòng nhập hướng dẫn hoặc paste bảng size thô cho AI!");
    return;
  }

  // Determine scope
  let codes = [...(currentBulkAiTarget || [])];
  let target_line = null;
  const scopeRadio = document.querySelector('input[name="scopeTarget"]:checked');
  if (scopeRadio && scopeRadio.value === 'line') {
      target_line = currentBulkLineTarget;
      codes = []; // Force backend to use target_line to resolve codes
  }

  if (codes.length === 0 && !target_line) {
      alert("⚠️ Không có sản phẩm nào được chọn!");
      return;
  }

  const btn = document.getElementById('btnRunNativeBulkAi');
  const ogText = btn.innerHTML;
  btn.innerHTML = '<div class="spinner-sm"></div> Đang gửi lệnh...';
  btn.disabled = true;

  try {
      const resp = await fetch('/api/bulk/ai-edit', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ codes, target_field: field, instruction, mode, target_line }),
      });
      const data = await resp.json();
      
      if (data.status === 'success') {
          document.getElementById('nativeBulkAiModal').style.display = 'none';
          alert(`✅ ${data.message}\\nTiến trình sẽ chạy dưới nền (Background Worker)`);
          
          // Poll ui in background
          setTimeout(() => {
              fetch(`/api/bulk/ai-edit-status`)
                .then(r => r.json())
                .then(s => {
                  if (s.is_running && s.total > 0) startAiEditBatchPolling();
                });
          }, 1500);
      } else {
          alert(`❌ Lỗi: ${data.message}`);
      }
  } catch (e) {
      alert(`❌ Lỗi gọi API: ${e.message}`);
  } finally {
      btn.innerHTML = ogText;
      btn.disabled = false;
  }
}

// Custom poller for AI Edit Queue (mapped to Tag polling tracking UI just to show running status)
let aiEditPollInterval = null;
function startAiEditBatchPolling() {
  if (aiEditPollInterval) return; 
  document.getElementById('tagsTrackingBox').style.display = 'flex'; // Reuse Tags box UI
  
  aiEditPollInterval = setInterval(async () => {
    try {
      const res = await fetch(`/api/bulk/ai-edit-status`);
      const data = await res.json();
      
      if (!data.is_running) {
        clearInterval(aiEditPollInterval);
        aiEditPollInterval = null;
        document.getElementById('tagsTrackTitle').innerText = '✅ Hoàn tất Bulk AI Edit!';
        document.getElementById('tagsTrackFill').style.background = '#059669';
        setTimeout(() => {
          document.getElementById('tagsTrackingBox').style.display = 'none';
          loadProducts(); 
        }, 5000);
        return;
      }
      
      const pct = data.total > 0 ? Math.round((data.done / data.total) * 100) : 0;
      document.getElementById('tagsTrackTitle').innerText = 'Hệ thống đang Bulk AI Edit (Sửa trường)...';
      document.getElementById('tagsTrackFill').style.background = '#2563eb';
      document.getElementById('tagsTrackText').innerText = `${data.done} / ${data.total} (${pct}%)`;
      document.getElementById('tagsTrackFill').style.width = pct + '%';
      document.getElementById('tagsTrackCode').innerText = data.current_name ? `→ ${data.current_name}` : '—';
      document.getElementById('tagsTrackErrors').innerText = data.errors || 0;
      
    } catch(e) {}
  }, 2000);
}


function startBatchPolling() {
  if (batchPollInterval) return; // Already polling
  document.getElementById('batchTrackingBox').style.display = 'flex';
  batchPollInterval = setInterval(async () => {
    try {
      const res = await fetch(`${API}/batch-status`);
      const data = await res.json();
      
      if (!data.progress || !data.progress.is_running) {
        clearInterval(batchPollInterval);
        batchPollInterval = null;
        document.getElementById('batchTrackTitle').innerText = '✅ Hoàn tất sinh AI hàng loạt!';
        document.getElementById('batchTrackFill').style.background = '#10b981';
        setTimeout(() => {
          document.getElementById('batchTrackingBox').style.display = 'none';
          loadOverview();
          loadProducts();
        }, 5000);
        return;
      }
      
      const prog = data.progress;
      const pct = Math.round((prog.done / prog.total) * 100) || 0;
      document.getElementById('batchTrackTitle').innerText = 'Hệ thống đang chạy AI hàng loạt...';
      document.getElementById('batchTrackFill').style.background = '#0ea5e9';
      document.getElementById('batchTrackText').innerText = `${prog.done} / ${prog.total} (${pct}%)`;
      document.getElementById('batchTrackFill').style.width = pct + '%';
      document.getElementById('batchTrackCode').innerText = prog.current_code || '—';
      document.getElementById('batchTrackErrors').innerText = prog.errors || 0;
      
    } catch(e) {
      console.error("Lỗi poll status:", e);
    }
  }, 2000); // poll every 2 seconds
}

// Check status on mount just in case a batch is already running
setTimeout(() => {
  fetch(`${API}/batch-status`)
    .then(r => r.json())
    .then(s => {
      if (s.is_running && s.progress) startBatchPolling();
      else if (s.progress && s.progress.is_running) startBatchPolling();
    })
    .catch(()=>{});
    
  fetch(`/api/bulk/tags-batch-status`)
    .then(r => r.json())
    .then(s => {
      if (s.progress && s.progress.is_running) startTagsBatchPolling();
    })
    .catch(()=>{});
}, 1000);

