// ══════════════════════════════════════════════
// RRB Admin — Module: ganancias-regs
// ══════════════════════════════════════════════

// ══════════════════════════════════════════════
let regsData       = null;   // respuesta completa del servidor
let regsFiltered   = [];     // registros actualmente visibles
let regsSortCol    = '_real';
let regsSortDir    = 'desc';
let regsStatusFilt = 'all';

// STATUS_INFO, statusBadge() y fmtMXN() están en core.js

// Inicializa mes/año al entrar a la sección
function iniciarGananciasRegs() {
  const now = new Date();
  // Las ganancias calculadas en el mes actual corresponden al mes anterior
  // => por defecto mostrar el mes anterior; bloquear el mes en curso
  const mesCurso = now.getMonth() + 1;   // 1-12
  const anioCurso = now.getFullYear();

  // Calcular mes anterior
  let mesAnterior = mesCurso - 1;
  let anioAnterior = anioCurso;
  if (mesAnterior === 0) { mesAnterior = 12; anioAnterior--; }

  document.getElementById('reg-mes').value  = mesAnterior;
  document.getElementById('reg-anio').value = anioAnterior;

  // Deshabilitar la opción del mes en curso en el selector
  const sel = document.getElementById('reg-mes');
  Array.from(sel.options).forEach(opt => {
    // Bloquear solo si el año del input coincide con el año actual
    opt.disabled = false; // limpiar primero
  });
  bloquearMesCursoRegs();
}

function bloquearMesCursoRegs() {
  const now = new Date();
  const mesCurso  = now.getMonth() + 1;
  const anioCurso = now.getFullYear();
  const anioSel   = parseInt(document.getElementById('reg-anio').value) || anioCurso;
  const sel       = document.getElementById('reg-mes');
  Array.from(sel.options).forEach(opt => {
    // Deshabilitar el mes actual solo si el año seleccionado es el actual
    opt.disabled = (anioSel === anioCurso && parseInt(opt.value) === mesCurso);
    if (opt.disabled) opt.title = 'El mes en curso aún no tiene ganancias generadas';
    else opt.title = '';
  });
  // Si el mes seleccionado quedó bloqueado, retroceder uno
  if (parseInt(sel.value) === mesCurso && anioSel === anioCurso) {
    let m = mesCurso - 1, a = anioCurso;
    if (m === 0) { m = 12; a--; }
    sel.value = m;
    document.getElementById('reg-anio').value = a;
  }
}

async function cargarGananciasRegs() {
  const mes  = document.getElementById('reg-mes').value;
  const anio = document.getElementById('reg-anio').value;
  if (!mes || !anio) { showToast('Selecciona mes y año', 'error'); return; }

  const btn = document.getElementById('btn-reg-buscar');
  btn.disabled = true;
  btn.textContent = '⏳ Consultando...';

  document.getElementById('reg-loading').style.display = 'block';
  document.getElementById('reg-result').style.display  = 'none';
  document.getElementById('reg-empty').style.display   = 'none';
  document.getElementById('reg-summary').style.display = 'none';
  document.getElementById('reg-filtros').style.display = 'none';
  document.getElementById('btn-reg-export').style.display = 'none';

  // Resetear filtro de status
  regsStatusFilt = 'all';
  document.querySelectorAll('.filter-tab').forEach(t => {
    t.classList.toggle('active', t.dataset.status === 'all');
  });

  try {
    const data = await api('GET', `api/ganancias-regs.php?mes=${mes}&anio=${anio}`);
    if (!data.success) throw new Error(data.message);
    regsData = data;
    regsFiltered = data.registros || [];
    renderRegsResumen(data);
    renderRegsTabla();
  } catch (err) {
    showToast('Error: ' + err.message, 'error');
    document.getElementById('reg-loading').style.display = 'none';
  } finally {
    btn.disabled = false;
    btn.textContent = '🔍 Consultar';
  }
}

function renderRegsResumen(data) {
  document.getElementById('reg-total-regs').textContent  = data.total_regs || 0;
  document.getElementById('reg-total-real').textContent  = fmtMXN(data.total_real);
  document.getElementById('reg-total-apagar').textContent= fmtMXN(data.total_apagar);
  const c = data.contadores || {};
  document.getElementById('reg-cnt-porpagar').textContent = c[0]  || 0;
  document.getElementById('reg-cnt-deposito').textContent = c[1]  || 0;
  document.getElementById('reg-cnt-voucher').textContent  = c[5]  || 0;
  document.getElementById('reg-cnt-retenida').textContent = c[20] || 0;
  document.getElementById('reg-summary').style.display = 'grid';
  document.getElementById('reg-filtros').style.display = 'flex';
}

function filtrarRegs(status) {
  regsStatusFilt = status;
  document.querySelectorAll('.filter-tab').forEach(t => {
    t.classList.toggle('active', t.dataset.status === String(status));
  });
  if (!regsData) return;
  if (status === 'all') {
    regsFiltered = [...(regsData.registros || [])];
  } else {
    regsFiltered = (regsData.registros || []).filter(r => String(r.status) === String(status));
  }
  renderRegsTabla();
}

function sortRegs(col) {
  if (regsSortCol === col) {
    regsSortDir = regsSortDir === 'asc' ? 'desc' : 'asc';
  } else {
    regsSortCol = col;
    regsSortDir = 'desc';
  }
  // Actualizar iconos
  ['puntos','calificados','niveles','_real','apagar'].forEach(c => {
    const el = document.getElementById('sort-' + c);
    if (el) el.textContent = c === regsSortCol ? (regsSortDir === 'asc' ? '↑' : '↓') : '⇅';
  });
  regsFiltered.sort((a, b) => {
    const va = Number(a[col]) || 0;
    const vb = Number(b[col]) || 0;
    return regsSortDir === 'asc' ? va - vb : vb - va;
  });
  renderRegsTabla();
}

function renderRegsTabla() {
  document.getElementById('reg-loading').style.display = 'none';
  const tbody = document.getElementById('reg-tbody');
  const tfoot = document.getElementById('reg-tfoot');

  if (regsFiltered.length === 0) {
    document.getElementById('reg-result').style.display = 'none';
    document.getElementById('reg-empty').style.display  = 'block';
    document.getElementById('btn-reg-export').style.display = 'none';
    return;
  }

  document.getElementById('reg-result').style.display = 'block';
  document.getElementById('reg-empty').style.display  = 'none';
  document.getElementById('btn-reg-export').style.display = 'inline-block';
  document.getElementById('reg-count').textContent =
    `${regsFiltered.length} registro${regsFiltered.length !== 1 ? 's' : ''}`;

  // Totales de la vista filtrada
  let sumReal = 0, sumApagar = 0;
  tbody.innerHTML = regsFiltered.map((r, i) => {
    sumReal   += Number(r._real)   || 0;
    sumApagar += Number(r.apagar)  || 0;
    // Botón voucher solo para status=0 (Por Pagar) y apagar > 0
    const puedeVoucher = (parseInt(r.status) === 0 && Number(r.apagar) > 0);
    // Usamos data-attributes para evitar problemas con caracteres especiales en nombres
    const btnVoucher = puedeVoucher
      ? `<button
          class="btn-vou-open"
          data-idreg="${r.idreg}"
          data-apagar="${Number(r.apagar)}"
          data-nombre="${String(r.nombre_completo || '').trim().replace(/"/g, '&quot;')}"
          data-ref="${String(r.referencia || '').replace(/"/g, '&quot;')}"
          style="padding:4px 10px;font-size:11px;border-radius:12px;border:1.5px solid #7c3aed;
                 background:#ede9fe;color:#5b21b6;cursor:pointer;font-weight:600;white-space:nowrap"
        >🟣 Voucher</button>`
      : '';
    return `<tr>
      <td style="color:var(--muted);font-size:12px">${i + 1}</td>
      <td style="font-weight:600">${esc(r.referencia || '')}</td>
      <td style="font-size:12px;color:var(--muted)">${esc(r.rfc || '')}</td>
      <td>${esc((r.nombre_completo || '').trim())}</td>
      <td style="text-align:center">${btnVoucher}</td>
      <td style="text-align:right;color:#15803d;font-weight:700">${fmtMXN(r.apagar)}</td>
      <td>${statusBadge(r.status)}</td>
      <td style="text-align:right;color:#1d4ed8;font-weight:600">${fmtMXN(r._real)}</td>
      <td style="text-align:center">${r.calificados || 0}</td>
      <td style="text-align:center">${r.niveles || 0}</td>
      <td style="text-align:right;font-weight:600">${Number(r.puntos || 0).toLocaleString('es-MX')}</td>
    </tr>`;
  }).join('');

  tfoot.innerHTML = `<tr style="background:#f5f8fc;font-weight:700">
    <td colspan="4" style="text-align:right;padding:10px 16px;font-size:13px">TOTALES</td>
    <td></td>
    <td style="text-align:right;color:#15803d;padding:10px 16px">${fmtMXN(sumApagar)}</td>
    <td></td>
    <td style="text-align:right;color:#1d4ed8;padding:10px 16px">${fmtMXN(sumReal)}</td>
    <td></td><td></td><td></td>
  </tr>`;
}

function exportarGananciasRegs() {
  if (!regsFiltered || regsFiltered.length === 0) return;
  const mes  = document.getElementById('reg-mes').value;
  const anio = document.getElementById('reg-anio').value;
  const MESES = ['','Enero','Febrero','Marzo','Abril','Mayo','Junio',
                 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
  const periodo = `${MESES[mes] || mes}_${anio}`;

  const cols = ['idreg','referencia','rfc','nombre_completo','puntos','calificados',
                'niveles','_real','apagar','impuestos','pagado','fechap','status','observaciones'];
  const labels = ['ID','Referencia','RFC','Nombre','Puntos','Calificados',
                  'Niveles','_real','A Pagar','Impuestos','Pagado','Fecha','Status','Observaciones'];
  const STATUS_LABEL = {0:'Por Pagar',1:'Depósito',5:'Voucher',20:'Retenida'};

  const csv = [
    labels.join(','),
    ...regsFiltered.map(r => cols.map(c => {
      let v = r[c] ?? '';
      if (c === 'status') v = STATUS_LABEL[v] || v;
      if (c === 'nombre_completo') v = (v + '').trim();
      return `"${String(v).replace(/"/g,'""')}"`;
    }).join(','))
  ].join('\n');

  const blob = new Blob(['\uFEFF' + csv], { type: 'text/csv;charset=utf-8;' });
  const url  = URL.createObjectURL(blob);
  const a    = document.createElement('a');
  a.href = url; a.download = `ganancias_${periodo}.csv`;
  a.click(); URL.revokeObjectURL(url);
}

