// ══════════════════════════════════════════════
// RRB Admin — Module: agrupaciones
// ══════════════════════════════════════════════

/* ═══════════════════════════════════════════════════════════════════════════
 MÓDULO AGRUPACIONES
 ═══════════════════════════════════════════════════════════════════════════ */

// Estado del carrito de agrupación
let _agrCarrito = []; // [{idtransacciones, fechat, tipo, cdentrega, referencia, nombre_dist, puntos}]

function agrFiltroChange() {
const tipo = document.getElementById('agr-filtro-tipo').value;
const wrap = document.getElementById('agr-filtro-valor-wrap');
wrap.style.display = (tipo === 'dia') ? 'none' : 'block';
if (tipo === 'dia') document.getElementById('agr-filtro-valor').value = '';
}

async function agrBuscar() {
const tipo  = document.getElementById('agr-filtro-tipo').value;
const valor = document.getElementById('agr-filtro-valor').value.trim();
const lista = document.getElementById('agr-lista');

// Mapear UI → backend
const filtroMap = { dia: 'hoy', transaccion: 'tx', referencia: 'ref' };
const filtro = filtroMap[tipo];

if (filtro !== 'hoy' && !valor) {
  lista.innerHTML = '<div style="text-align:center;padding:20px;color:#dc3545;font-size:13px">Ingresa un valor para buscar</div>';
  return;
}

lista.innerHTML = '<div style="text-align:center;padding:30px;color:#aaa;font-size:13px">⏳ Buscando...</div>';

try {
  let url = `api/agrupacion-buscar.php?filtro=${filtro}`;
  if (valor) url += `&valor=${encodeURIComponent(valor)}`;
  const res = await api('GET', url);
  if (!res.success) throw new Error(res.message || 'Error en búsqueda');
  agrRenderLista(res.data.notas || []);
} catch(e) {
  lista.innerHTML = `<div style="text-align:center;padding:20px;color:#dc3545;font-size:13px">❌ ${e.message}</div>`;
}
}

function agrRenderLista(notas) {
const lista = document.getElementById('agr-lista');
if (!notas.length) {
  lista.innerHTML = '<div style="text-align:center;padding:30px;color:#aaa;font-size:13px">Sin notas disponibles para agrupar</div>';
  return;
}
lista.innerHTML = notas.map(n => {
  const enCarrito = _agrCarrito.some(c => c.idtransacciones == n.idtransacciones);
  const tipoLabel = n.tipo == 10 ? 'Venta' : 'Salida';
  return `
    <div style="background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:12px 14px;display:flex;align-items:center;gap:12px">
      <div style="flex:1;min-width:0">
        <div style="font-size:13px;font-weight:600;color:var(--primary)">#${n.idtransacciones} — ${tipoLabel}</div>
        <div style="font-size:12px;color:var(--muted);margin-top:2px">${n.nombre_dist} <span style="color:#aaa">(${n.referencia})</span></div>
        <div style="font-size:12px;color:var(--muted)">${n.fechat} · Centro: ${n.cdentrega} · ${fmtNum(n.puntos)} pts</div>
      </div>
      <button onclick="agrToggleCarrito(${JSON.stringify(n).replace(/"/g,'&quot;')})"
        style="padding:6px 14px;border:none;border-radius:6px;cursor:pointer;font-size:12px;font-weight:600;
          background:${enCarrito ? '#fef2f2' : '#eff6ff'};color:${enCarrito ? '#b91c1c' : '#1d4ed8'}">
        ${enCarrito ? '✕ Quitar' : '+ Agregar'}
      </button>
    </div>`;
}).join('');
}

function agrToggleCarrito(nota) {
const idx = _agrCarrito.findIndex(c => c.idtransacciones == nota.idtransacciones);
if (idx >= 0) {
  _agrCarrito.splice(idx, 1);
} else {
  _agrCarrito.push(nota);
}
agrActualizarCarrito();
// Re-render lista para actualizar botones
const listaEl = document.getElementById('agr-lista');
const items = listaEl.querySelectorAll('[data-nota-id]');
// Si no hay data-nota-id, re-buscamos — pero mejor refrescamos solo los botones
listaEl.querySelectorAll('button').forEach(btn => {
  const match = btn.getAttribute('onclick');
  if (!match) return;
  // Extraer id de la nota del onclick
  const m = match.match(/"idtransacciones":(\d+)/);
  if (!m) return;
  const id = parseInt(m[1]);
  const enCarrito = _agrCarrito.some(c => c.idtransacciones == id);
  btn.style.background = enCarrito ? '#fef2f2' : '#eff6ff';
  btn.style.color = enCarrito ? '#b91c1c' : '#1d4ed8';
  btn.textContent = enCarrito ? '✕ Quitar' : '+ Agregar';
});
}

function agrActualizarCarrito() {
const el = document.getElementById('agr-carrito');
const btnCrear = document.getElementById('agr-btn-crear');
const cdWrap = document.getElementById('agr-cdentrega-wrap');
const resWrap = document.getElementById('agr-resumen-wrap');

if (!_agrCarrito.length) {
  el.innerHTML = '<div style="text-align:center;padding:16px;color:#aaa;font-size:13px">Sin notas seleccionadas</div>';
  btnCrear.disabled = true;
  btnCrear.style.opacity = '0.4';
  cdWrap.style.display = 'none';
  resWrap.style.display = 'none';
  return;
}

// Calcular totales de productos acumulados
const totalesMap = {};
for (const n of _agrCarrito) {
  for (const p of (n.productos || [])) {
    if (!totalesMap[p.id_prod]) totalesMap[p.id_prod] = { nombre: p.nombre, cant: 0 };
    totalesMap[p.id_prod].cant += p.cant;
  }
}
const totalesArr = Object.values(totalesMap);
const totalUnidades = totalesArr.reduce((s, p) => s + p.cant, 0);

el.innerHTML = _agrCarrito.map(n => {
  const prodsNota = (n.productos || []);
  const totalNota = prodsNota.reduce((s, p) => s + p.cant, 0);
  const prodsStr  = prodsNota.map(p => `${p.nombre} ×${p.cant}`).join(', ');
  return `
  <div style="background:#fff;border:1px solid #e0e0e0;border-radius:6px;padding:8px 10px">
    <div style="display:flex;align-items:center;gap:8px">
      <div style="flex:1;min-width:0">
        <div style="font-size:12px;font-weight:600;color:var(--primary)">#${n.idtransacciones} <span style="font-weight:400;color:#555">— ${totalNota} unid.</span></div>
        <div style="font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis">${n.nombre_dist}</div>
        <div style="font-size:11px;color:#aaa">Centro: ${n.cdentrega} · ${n.fechat}</div>
      </div>
      <button onclick="_agrCarrito.splice(_agrCarrito.findIndex(c=>c.idtransacciones==${n.idtransacciones}),1);agrActualizarCarrito()"
        style="background:none;border:none;color:#dc3545;cursor:pointer;font-size:16px;line-height:1;padding:2px 4px;flex-shrink:0">✕</button>
    </div>
    ${prodsStr ? `<div style="font-size:10px;color:#888;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">${prodsStr}</div>` : ''}
  </div>`;
}).join('');

// Total acumulado al pie del carrito
if (totalesArr.length) {
  const totalHtml = totalesArr.map(p => `<span style="display:inline-block;background:#e8f0fe;color:#1d4ed8;border-radius:4px;padding:2px 7px;font-size:11px;margin:2px">${p.nombre} ×${p.cant}</span>`).join('');
  el.innerHTML += `
    <div style="margin-top:8px;padding:8px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px">
      <div style="font-size:11px;font-weight:600;color:#15803d;margin-bottom:4px">📦 Total a entregar: ${totalUnidades} unidades</div>
      <div style="line-height:1.8">${totalHtml}</div>
    </div>`;
}

// Detectar si hay múltiples cdentrega y poblar el select solo con esos centros
const centros = [...new Set(_agrCarrito.map(n => n.cdentrega))];
const sel = document.getElementById('agr-cdentrega');
if (centros.length > 1) {
  const prevVal = sel.value;
  sel.innerHTML = '<option value="">-- Selecciona --</option>' +
    centros.map(c => `<option value="${c}"${prevVal == c ? ' selected' : ''}>Centro ${c}</option>`).join('');
  cdWrap.style.display = 'block';
} else {
  cdWrap.style.display = 'none';
  sel.value = '';
}

// Habilitar botón si hay ≥ 2 notas
if (_agrCarrito.length >= 2) {
  btnCrear.disabled = false;
  btnCrear.style.opacity = '1';
} else {
  btnCrear.disabled = true;
  btnCrear.style.opacity = '0.4';
}

resWrap.style.display = 'none'; // se mostrará solo tras crear
}

async function agrCrear() {
if (_agrCarrito.length < 2) {
  alert('Debes agregar al menos 2 notas para crear una agrupación');
  return;
}

// Validar centro generador
const cdVenta = parseInt(document.getElementById('agr-cdventa').value) || 0;
if (!cdVenta) {
  alert('Debes seleccionar el centro que genera la agrupación.');
  document.getElementById('agr-cdventa').focus();
  return;
}

// Validar centro de entrega si hay diferencias
const centros = [...new Set(_agrCarrito.map(n => n.cdentrega))];
let cdentrega = null;
if (centros.length > 1) {
  cdentrega = parseInt(document.getElementById('agr-cdentrega').value) || 0;
  if (!cdentrega || cdentrega < 1) {
    alert('Las notas tienen centros distintos. Debes seleccionar el centro de entrega para la nota agrupada.');
    document.getElementById('agr-cdentrega').focus();
    return;
  }
}

const btn = document.getElementById('agr-btn-crear');
const origText = btn.textContent;
btn.disabled = true;
btn.textContent = '⏳ Creando...';

try {
  const body = { ids: _agrCarrito.map(n => n.idtransacciones), cd_venta: cdVenta };
  if (cdentrega) body.cdentrega = cdentrega;

  const res = await api('POST', 'api/agrupacion-crear.php', body);
  if (!res.success) throw new Error(res.message || 'Error al crear agrupación');

  const d = res.data;

  // Limpiar carrito y ocultar resumen previo
  _agrCarrito = [];
  agrActualizarCarrito();
  document.getElementById('agr-resumen-wrap').style.display = 'none';

  // Mostrar resultado con detalle completo y botón PDF
  agrMostrarResultado(d);

  // Re-buscar para actualizar lista
  agrBuscar();

} catch(e) {
  alert('❌ Error: ' + e.message);
  btn.disabled = false;
  btn.textContent = origText;
} finally {
  btn.textContent = origText;
}
}

function agrMostrarResultado(d) {
const wrap = document.getElementById('agr-resultado-wrap');
const totalUnid = (d.productos || []).reduce((s, p) => s + p.cant, 0);

const notasHtml = (d.notas || []).map(n => {
  const pStr = (n.productos || []).map(p => `${p.nombre} ×${p.cant}`).join(', ');
  return `<div style="padding:6px 0;border-bottom:1px solid #f0f0f0">
    <div style="font-size:12px;font-weight:600;color:var(--primary)">#${n.idtransacciones} — ${n.nombre_dist}</div>
    <div style="font-size:11px;color:#aaa">Ref: ${n.referencia} · ${n.fechat}</div>
    ${pStr ? `<div style="font-size:11px;color:#555;margin-top:2px">${pStr}</div>` : ''}
  </div>`;
}).join('');

const prodsHtml = (d.productos || []).map(p =>
  `<div style="display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid #eee;font-size:12px">
    <span>${p.nombre}</span><span style="font-weight:600">${p.cant}</span>
  </div>`).join('');

wrap.style.display = 'block';
wrap.innerHTML = `
  <div style="background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:12px">
    <div style="font-size:13px;font-weight:700;color:#15803d;margin-bottom:6px">✅ Agrupación #${d.id_grupo_tx} creada — Grupo ${d.num_grupo}</div>
    <div style="font-size:11px;color:#555;margin-bottom:8px">Centro: ${d.nombre_cd_venta} · ${d.fecha} · ${totalUnid} unidades</div>
    <div style="margin-bottom:8px">${notasHtml}</div>
    <div style="background:#fff;border-radius:6px;padding:8px;margin-bottom:8px">
      <div style="font-size:11px;font-weight:600;color:#555;margin-bottom:4px;text-transform:uppercase">Productos totales</div>
      ${prodsHtml}
    </div>
    <button onclick="agrImprimirPDF(${JSON.stringify(d).replace(/"/g,'&quot;')})"
      style="width:100%;padding:8px;background:#1d4ed8;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:13px;font-weight:600">
      🖨️ Imprimir / Guardar PDF
    </button>
  </div>`;
}

function agrImprimirPDF(d) {
const totalUnid = (d.productos || []).reduce((s, p) => s + p.cant, 0);

const notasRows = (d.notas || []).map(n => {
  const pStr = (n.productos || []).map(p => `${p.nombre} ×${p.cant}`).join('<br>');
  return `<tr>
    <td style="padding:4px 6px;border:1px solid #ddd;font-size:11px;vertical-align:top">#${n.idtransacciones}</td>
    <td style="padding:4px 6px;border:1px solid #ddd;font-size:11px;vertical-align:top">${n.nombre_dist}<br><span style="color:#888">${n.referencia}</span></td>
    <td style="padding:4px 6px;border:1px solid #ddd;font-size:11px;vertical-align:top">${pStr}</td>
  </tr>`;
}).join('');

const prodsRows = (d.productos || []).map(p =>
  `<tr>
    <td style="padding:3px 6px;border:1px solid #ddd;font-size:11px">${p.nombre}</td>
    <td style="padding:3px 6px;border:1px solid #ddd;font-size:11px;text-align:center;font-weight:600">${p.cant}</td>
  </tr>`).join('');

const copia = `
  <div style="width:100%;padding:10px 14px;box-sizing:border-box;font-family:Arial,sans-serif">
    <div style="text-align:center;margin-bottom:8px">
      <img src="${_RRB_LOGO}" style="height:36px;object-fit:contain" alt="RRB">
    </div>
    <div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px">
      <div>
        <div style="font-size:14px;font-weight:700">Agrupación #${d.id_grupo_tx} — Grupo ${d.num_grupo}</div>
        <div style="font-size:11px;color:#555">${d.fecha} · Centro: ${d.nombre_cd_venta} · ${totalUnid} unidades</div>
      </div>
      <div style="font-size:10px;color:#aaa">PENDIENTE</div>
    </div>
    <table style="width:100%;border-collapse:collapse;margin-bottom:8px">
      <thead><tr>
        <th style="padding:4px 6px;border:1px solid #ddd;font-size:11px;background:#f5f5f5;text-align:left">#TX</th>
        <th style="padding:4px 6px;border:1px solid #ddd;font-size:11px;background:#f5f5f5;text-align:left">Distribuidor</th>
        <th style="padding:4px 6px;border:1px solid #ddd;font-size:11px;background:#f5f5f5;text-align:left">Productos</th>
      </tr></thead>
      <tbody>${notasRows}</tbody>
    </table>
    <table style="width:100%;border-collapse:collapse">
      <thead><tr>
        <th style="padding:3px 6px;border:1px solid #ddd;font-size:11px;background:#f5f5f5;text-align:left">Producto</th>
        <th style="padding:3px 6px;border:1px solid #ddd;font-size:11px;background:#f5f5f5;text-align:center">Total</th>
      </tr></thead>
      <tbody>${prodsRows}</tbody>
    </table>
  </div>`;

const html = `<!DOCTYPE html><html><head><meta charset="utf-8">
  <style>
    @page { size: letter portrait; margin: 0; }
    * { box-sizing: border-box; }
    body { margin: 0; padding: 0; }
    .hoja { width: 215.9mm; height: 279.4mm; display: flex; flex-direction: row; }
    .mitad { width: 107.95mm; height: 279.4mm; overflow: hidden; border-right: 1px dashed #ccc; }
    .mitad:last-child { border-right: none; }
    @media print { body { -webkit-print-color-adjust: exact; } }
  </style>
  </head><body>
  <div class="hoja">
    <div class="mitad">${copia}</div>
    <div class="mitad">${copia}</div>
  </div>
  <script>window.onload=function(){window.print();}<\/script>
  </body></html>`;

const w = window.open('', '_blank');
w.document.write(html);
w.document.close();
}




// ══════════════════════════════════════════════════════════════════
// AGRUPACIONES — INIT
// ══════════════════════════════════════════════════════════════════

let _agrCentrosLoaded = false;

async function agrInit() {
if (_agrCentrosLoaded) return;
const sel = document.getElementById('agr-cdventa');
try {
  const res = await api('GET', 'api/agrupacion-centros.php');
  const centros = res.centros || [];
  sel.innerHTML = '<option value="">-- Selecciona centro --</option>' +
    centros.map(c => `<option value="${c.idusuarios_ci}">${c.idusuarios_ci} — ${c.nombre}</option>`).join('');
  _agrCentrosLoaded = true;
  // Auto-select si es centro logueado
  if (esCentro()) { autoSelectCentro('agr-cdventa'); }
} catch(e) {
  sel.innerHTML = '<option value="">Error al cargar centros</option>';
}
}

// ══════════════════════════════════════════════════════════════════
// AGRUPACIONES — HISTORIAL
// ══════════════════════════════════════════════════════════════════

function agrSwitchTab(tab) {
const panelNueva    = document.getElementById('agr-panel-nueva');
const panelHistorial = document.getElementById('agr-panel-historial');
const btnNueva      = document.getElementById('agr-tab-nueva');
const btnHistorial  = document.getElementById('agr-tab-historial');

if (tab === 'nueva') {
  panelNueva.style.display    = 'block';
  panelHistorial.style.display = 'none';
  btnNueva.style.background   = 'var(--primary)';
  btnNueva.style.color        = '#fff';
  btnHistorial.style.background = '#e9ecef';
  btnHistorial.style.color    = '#555';
} else {
  panelNueva.style.display    = 'none';
  panelHistorial.style.display = 'block';
  btnNueva.style.background   = '#e9ecef';
  btnNueva.style.color        = '#555';
  btnHistorial.style.background = 'var(--primary)';
  btnHistorial.style.color    = '#fff';
  agrHistInicializar();
}
}

function agrHistInicializar() {
const sel = document.getElementById('agr-hist-mes');
if (sel.options.length > 1) return; // ya inicializado
const now = new Date();
const meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
               'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
for (let i = 0; i < 6; i++) {
  const d = new Date(now.getFullYear(), now.getMonth() - i, 1);
  const val = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`;
  const lbl = `${meses[d.getMonth()]} ${d.getFullYear()}`;
  const opt = document.createElement('option');
  opt.value = val;
  opt.textContent = lbl;
  sel.appendChild(opt);
}
}

function agrHistFiltroChange() {
const filtro = document.getElementById('agr-hist-filtro').value;
document.getElementById('agr-hist-mes-wrap').style.display = filtro === 'mes' ? 'block' : 'none';
document.getElementById('agr-hist-tx-wrap').style.display  = filtro === 'tx'  ? 'block' : 'none';
}

async function agrHistCargar() {
const lista  = document.getElementById('agr-hist-lista');
const filtro = document.getElementById('agr-hist-filtro').value;
let url = `api/agrupacion-historial.php?filtro=${filtro}`;

if (filtro === 'mes') {
  const mes = document.getElementById('agr-hist-mes').value;
  if (!mes) { alert('Selecciona un mes'); return; }
  url += `&mes=${mes}`;
} else {
  const tx = document.getElementById('agr-hist-tx').value.trim();
  if (!tx) { alert('Ingresa un número de transacción'); return; }
  url += `&valor=${encodeURIComponent(tx)}`;
}

lista.innerHTML = '<div style="text-align:center;padding:30px;color:#aaa;font-size:13px">⏳ Cargando...</div>';

try {
  const res = await api('GET', url);
  if (!res.success) throw new Error(res.message || 'Error al cargar historial');
  agrHistRender(res.data.grupos || []);
} catch(e) {
  lista.innerHTML = `<div style="text-align:center;padding:20px;color:#dc3545;font-size:13px">❌ ${e.message}</div>`;
}
}

function agrHistRender(grupos) {
const lista = document.getElementById('agr-hist-lista');
if (!grupos.length) {
  lista.innerHTML = '<div style="text-align:center;padding:40px;color:#aaa;font-size:13px">Sin agrupaciones encontradas</div>';
  return;
}

const statusColor = s => s === 'ENTREGADO' ? '#f0fdf4' : '#fef3c7';
const statusText  = s => s === 'ENTREGADO' ? '#166534'  : '#92400e';

lista.innerHTML = grupos.map(g => {
  const prods = (g.productos || []).map(p =>
    `<span style="display:inline-block;background:#e8f0fe;color:#1a3a6b;border-radius:4px;padding:2px 8px;font-size:11px;margin:2px">${p.nombre} ×${p.cant}</span>`
  ).join('');
  const notas = (g.notas || []).map(n =>
    `<div style="font-size:12px;color:var(--muted);padding:2px 0">
      #${n.idtransacciones} — ${n.nombre_dist} <span style="color:#aaa">(${n.referencia})</span>
      <span style="margin-left:6px;padding:1px 6px;border-radius:10px;font-size:10px;font-weight:600;
        background:${statusColor(n.statusentrega)};color:${statusText(n.statusentrega)}">${n.statusentrega}</span>
    </div>`
  ).join('');
  const totalUnid = g.total_unidades || 0;
  // Construir objeto compatible con agrImprimirPDF
  const pdfData = {
    id_grupo_tx: g.idtransacciones,
    num_grupo: g.num_grupo,
    fecha: g.fechat ? g.fechat.substring(0,10) : '',
    nombre_cd_venta: g.cd_venta ? `Centro ${g.cd_venta}` : '',
    productos: g.productos || [],
    notas: (g.notas || []).map(n => ({
      idtransacciones: n.idtransacciones,
      nombre_dist: n.nombre_dist,
      referencia: n.referencia,
      fechat: g.fechat ? g.fechat.substring(0,10) : '',
      productos: g.productos || [] // fallback; historial no tiene prods por nota
    }))
  };
  const pdfJson = JSON.stringify(pdfData).replace(/"/g,'&quot;');
  return `
    <div style="background:#fff;border:1px solid #e0e0e0;border-radius:10px;padding:14px 16px">
      <div style="display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap">
        <div style="flex:1;min-width:0">
          <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px">
            <span style="font-size:14px;font-weight:700;color:var(--primary)">#${g.idtransacciones}</span>
            <span style="background:#fef3c7;color:#92400e;padding:2px 8px;border-radius:12px;font-size:11px;font-weight:600">Grupo #${g.num_grupo}</span>
            <span style="padding:2px 8px;border-radius:12px;font-size:11px;font-weight:600;
              background:${statusColor(g.statusentrega)};color:${statusText(g.statusentrega)}">${g.statusentrega}</span>
          </div>
          <div style="font-size:12px;color:var(--muted)">${g.fechat} · Centro entrega: ${g.cdentrega} · ${totalUnid} unidades</div>
          <div style="margin-top:6px">${prods}</div>
          ${notas ? `<div style="margin-top:8px;padding-top:8px;border-top:1px solid #f0f0f0">
            <div style="font-size:11px;color:#aaa;margin-bottom:4px;text-transform:uppercase;letter-spacing:.4px">Notas incluidas</div>
            ${notas}
          </div>` : ''}
        </div>
        <button onclick="agrImprimirPDF(${pdfJson})"
          style="flex-shrink:0;padding:6px 12px;background:#1d4ed8;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:12px;font-weight:600">
          🖨️ PDF
        </button>
      </div>
    </div>`;
}).join('');
}
