// ══════════════════════════════════════════════
// RRB Admin — Module: core
// Utilidades compartidas, API, navegación
// ══════════════════════════════════════════════

// ── Configuración ──
const API       = 'https://api.sistemarrb.com/admin';
const TOKEN_KEY = 'rrb_admin_token';
const USER_KEY  = 'rrb_admin_user';

// ── Estado global ──
let _prodData = null;
let _prodTabActual = 'productos';

// ── Rol y Centro logueado ──
const ROLE_KEY     = 'rrb_role';
const CD_ID_KEY    = 'rrb_cd_id';
const CD_NOMBRE_KEY = 'rrb_cd_nombre';
const MODULOS_KEY  = 'rrb_modulos';

function getRole()     { return localStorage.getItem(ROLE_KEY) || 'admin'; }
function esCentro()    { return getRole() === 'centro'; }
function getCdId()     { return localStorage.getItem(CD_ID_KEY) || null; }
function getCdNombre() { return localStorage.getItem(CD_NOMBRE_KEY) || ''; }
function getModulos()  {
  try { return JSON.parse(localStorage.getItem(MODULOS_KEY) || '[]'); }
  catch { return []; }
}

// ── DOM ──
const pageLogin  = document.getElementById('page-login');
const pageDash   = document.getElementById('page-dashboard');
const loginForm  = document.getElementById('login-form');
const inpUser    = document.getElementById('inp-user');
const inpPass    = document.getElementById('inp-pass');
const btnLogin   = document.getElementById('btn-login');
const alertBox   = document.getElementById('alert-box');
const togglePass = document.getElementById('toggle-pass');
const btnLogout  = document.getElementById('btn-logout');
const userNameEl = document.getElementById('user-name');
const welcomeEl  = document.getElementById('welcome-name');
const avatarEl   = document.getElementById('user-avatar');
const toast      = document.getElementById('toast');

// ── Alertas y Toasts ──
function showAlert(msg, type = 'error') {
  alertBox.textContent = msg;
  alertBox.className = `alert ${type} show`;
}
function hideAlert() { alertBox.className = 'alert'; }

let toastTimer;
function showToast(msg, type = 'success') {
  clearTimeout(toastTimer);
  toast.textContent = msg;
  toast.className = `toast ${type} show`;
  toastTimer = setTimeout(() => { toast.className = 'toast'; }, 3000);
}

// ── Token ──
function token() { return localStorage.getItem(TOKEN_KEY) || ''; }

// ── API ──
async function api(method, endpoint, body) {
  const opts = {
    method,
    headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token()}` }
  };
  if (body) opts.body = JSON.stringify(body);
  const res  = await fetch(`${API}/${endpoint}`, opts);
  const text = await res.text();
  try {
    return JSON.parse(text);
  } catch(e) {
    console.error(`[api] Respuesta no-JSON de ${endpoint}:`, text);
    return { ok: false, error: 'Respuesta inválida del servidor: ' + (text.substring(0, 200) || '(vacía)') };
  }
}

// ── Utilidades globales ──
function formatDate(d) {
  if (!d) return '—';
  const [y, m, day] = d.split('-');
  return `${day}/${m}/${y}`;
}

function esc(str) {
  return String(str || '').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
}

function fmtPts(v) {
  const n = Number(v || 0);
  if (n >= 1000000) return (n/1000000).toFixed(1).replace(/\.0$/,'') + 'M';
  if (n >= 1000)    return (n/1000).toFixed(1).replace(/\.0$/,'') + 'k';
  return n.toLocaleString('es-MX', {maximumFractionDigits: 0});
}

function fmtMXN(v) {
  return '$' + Number(v || 0).toLocaleString('es-MX', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}

const STATUS_INFO = {
  0:  { label: 'Por Pagar', cls: 'por-pagar',  icon: '🟡' },
  1:  { label: 'Depósito',  cls: 'deposito',   icon: '🟢' },
  5:  { label: 'Voucher',   cls: 'voucher',    icon: '🟣' },
  20: { label: 'Retenida',  cls: 'retenida',   icon: '🔴' },
};

function statusBadge(s) {
  const info = STATUS_INFO[s] || { label: 'Desconocido', cls: 'desconocido', icon: '⚪' };
  return `<span class="badge-reg ${info.cls}">${info.icon} ${info.label}</span>`;
}

// ── Navegación ──
function goSection(name) {
  document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
  document.querySelectorAll('.sidebar-item').forEach(s => s.classList.remove('active'));
  document.getElementById(`section-${name}`)?.classList.add('active');
  document.querySelector(`.sidebar-item[data-section="${name}"]`)?.classList.add('active');
  if (name === 'home') { _dashLoaded = false; cargarDashboard(); }
  if (name === 'avisos') cargarAvisos();
  if (name === 'reportes') iniciarReportes();
  if (name === 'ganancias-regs') iniciarGananciasRegs();
  if (name === 'voucher-grupal') iniciarVoucherGrupal();
  if (name === 'notas-asignar') iniciarNotasAsignar();
  if (name === 'productos') { if (!_prodData) cargarProductos(); }
  if (name === 'ordenes-pendientes') cargarOrdenesPendientes();
  if (name === 'transacciones') txInit();
  if (name === 'inventario') invInit();
  if (name === 'pedidos-stock') psCargar();
  if (name === 'nueva-compra') ncInit();
  if (name === 'distribuidores') distInit();
  if (name === 'agrupaciones') agrInit();
  if (name === 'entrega') entInit();
  if (name === 'kyc') kycInit();
  if (name === 'depositos-banco') dbnInit();
  if (name === 'modulos-cd') mcdInit();
}

// ── Filtrar sidebar según rol ──
function aplicarRol() {
  const body = document.body;
  if (esCentro()) {
    body.classList.add('role-centro');
    body.classList.remove('role-admin');
    const modulos = getModulos();
    document.querySelectorAll('.sidebar-item[data-section]').forEach(item => {
      const sec = item.dataset.section;
      // 'home' siempre visible; 'modulos-cd' solo admin
      if (sec === 'home') { item.style.display = ''; return; }
      if (sec === 'modulos-cd') { item.style.display = 'none'; return; }
      item.style.display = modulos.includes(sec) ? '' : 'none';
    });
  } else {
    body.classList.add('role-admin');
    body.classList.remove('role-centro');
    document.querySelectorAll('.sidebar-item[data-section]').forEach(item => {
      item.style.display = '';
    });
  }
}

// ── Auto-seleccionar centro en selects cuando es rol centro ──
function autoSelectCentro(selectId) {
  if (!esCentro()) return false;
  const sel = document.getElementById(selectId);
  if (!sel) return false;
  const cdId = getCdId();
  // Buscar la opción que coincida
  for (let i = 0; i < sel.options.length; i++) {
    if (String(sel.options[i].value) === String(cdId)) {
      sel.selectedIndex = i;
      sel.disabled = true;
      sel.dispatchEvent(new Event('change'));
      return true;
    }
  }
  return false;
}

// ── Sidebar listeners ──
document.querySelectorAll('.sidebar-item[data-section]').forEach(item => {
  item.addEventListener('click', () => goSection(item.dataset.section));
});

// ── Drawer móvil ──
function toggleSidebar() {
  const sidebar = document.querySelector('.sidebar');
  const overlay = document.getElementById('sidebar-overlay');
  const isOpen  = sidebar.classList.contains('open');
  if (isOpen) {
    sidebar.classList.remove('open');
    overlay.classList.remove('open');
  } else {
    sidebar.classList.add('open');
    overlay.classList.add('open');
  }
}

function cerrarSidebar() {
  document.querySelector('.sidebar').classList.remove('open');
  document.getElementById('sidebar-overlay').classList.remove('open');
}

// Cerrar drawer al navegar a una sección (en móvil)
document.querySelectorAll('.sidebar-item[data-section]').forEach(item => {
  item.addEventListener('click', () => {
    if (window.innerWidth <= 768) cerrarSidebar();
  });
});
