/* dashboard-real.jsx — Dashboard del día (modelo REAL): estado de la jornada, métricas, alertas accionables
   y mapa de rutas por macro-zona. Lee la asignación del store (fuente única). window.CR.screens.DashboardReal */
(function () {
  var React = window.React;
  var ui = window.CR.ui, store = window.CR.store;
  var h = React.createElement;

  function money(n) { return '$' + Number(n || 0).toLocaleString('es-AR'); }

  // metadatos de cada tipo de discrepancia -> alerta accionable
  var ALERTA = {
    sin_recurso: { titulo: 'Rutas sin cubrir', sev: 'alta', bloqueante: true,
      que: 'No hay chofer/vehículo elegible. Bloquea la confirmación.', accion: 'Resolver ahora' },
    tarifa_mal_amortizada: { titulo: 'Tarifa diferencial mal amortizada', sev: 'media',
      que: 'Unidad cara en ruta corta. Conviene reservarla para 51–100 km.', accion: 'Revisar' },
    sobre_rotacion: { titulo: 'Choferes con mucha rotación', sev: 'media',
      que: 'Ya trabajaron muchos días esta semana.', accion: 'Revisar' },
    tarifa_proveedor_pendiente: { titulo: 'Rutas sin tarifa de proveedor aplicable', sev: 'media',
      que: 'Revisá la tarifa de la patente y su vigencia en Tarifa de proveedores.', accion: 'Ver rutas' },
    tarifa_sin_unidad: { titulo: 'Rutas que no cotizan', sev: 'media',
      que: 'La UNIDAD del vehículo no está en el catálogo (suele venir vacía en la base de flota): la ruta se despacha pero cotiza $0.', accion: 'Revisar' },
    zona_sin_clasificar: { titulo: 'Barrios sin macro-zona', sev: 'media',
      que: 'Se asignaron igual por otros criterios, pero no entran al mapa.', accion: 'Ver' },
    backup_manual: { titulo: 'BackUp a asignar a mano', sev: 'baja',
      que: 'El pedido de flota llega por mail; no entra al automático.', accion: 'Ver' }
  };
  var SEV_ORDEN = { alta: 0, media: 1, baja: 2 };

  function DashboardReal() {
    window.CR.useStore();
    var ackState = React.useState(null), acks = ackState[0], setAcks = ackState[1];
    var backendOn = !!(window.CR.backend && window.CR.backend.enabled);
    var data = store.list('asignacionReal')[0] || null;
    var rutas = (data && data.rutas) || [];
    var resumen = (data && data.resumen) || null;
    var disc = (data && data.discrepancias) || [];

    React.useEffect(function () {
      if (!window.CR.backend || !window.CR.backend.enabled || !window.CR.backend.tableroAcks) return;
      // sin fecha: la jornada OPERATIVA, no la del reloj (v0.68.1)
      window.CR.backend.tableroAcks('').then(setAcks).catch(function () { setAcks(null); });
    }, [backendOn, data && data.fechaOperacion]);

    function irA(hash) { window.location.hash = hash; }

    if (!rutas.length) {
      return h('div', null,
        h(ui.Page, { title: 'Dashboard del día', subtitle: 'Jornada: ' + (data && data.fechaOperacion || 'sin seleccionar') + ' · Resumen, alertas y mapa de rutas.' }),
        h(ui.Card, null, h(ui.EmptyState, {
          title: 'Todavía no hay una programación cargada',
          action: h(ui.Button, { variant: 'primary', onClick: function () { irA('#/asignacion-real'); } }, 'Ir a asignar rutas')
        }, backendOn ? 'Cargá la base de flota y las rutas del día para ver acá el resumen, las alertas y el mapa.'
          : 'El backend no está conectado.')));
    }

    // ---- estado de la jornada ----
    var confirmadas = rutas.filter(function (r) { return r.estado === 'confirmada'; }).length;
    var asignadas = rutas.filter(function (r) { return r.patente && r.estado !== 'manual'; }).length;
    var ajustadas = rutas.filter(function (r) { return r.ajustada; }).length;
    var choferes = Object.keys(rutas.reduce(function (m, r) { if (r.patente) m[r.patente] = 1; return m; }, {})).length;
    var cobertura = resumen ? Math.round(resumen.asignadas / Math.max(1, resumen.asignadas + resumen.sinCubrir) * 100) : 0;
    var estado = confirmadas ? { txt: 'Programación confirmada', color: 'ok' }
      : (asignadas ? { txt: 'Propuesta lista — falta confirmar', color: 'info' } : { txt: 'Sin asignar', color: 'warn' });

    // ---- alertas accionables (agrupadas por tipo) ----
    var grupos = {};
    disc.forEach(function (d) { (grupos[d.tipo] = grupos[d.tipo] || []).push(d); });
    var alertas = Object.keys(grupos).map(function (tipo) {
      var meta = ALERTA[tipo] || { titulo: String(tipo).replace(/_/g, ' '), sev: 'media', que: '', accion: 'Ver' };
      return { tipo: tipo, n: grupos[tipo].length, meta: meta, ejemplos: grupos[tipo].slice(0, 2) };
    }).sort(function (a, b) { return (SEV_ORDEN[a.meta.sev] - SEV_ORDEN[b.meta.sev]) || (b.n - a.n); });
    var bloqueantes = alertas.filter(function (a) { return a.meta.bloqueante; }).reduce(function (s, a) { return s + a.n; }, 0);

    return h('div', null,
      h(ui.Page, { title: 'Dashboard del día', subtitle: 'Jornada: ' + (data && data.fechaOperacion || 'sin seleccionar') + ' · Resumen, alertas accionables y mapa de rutas por zona.' }),

      h(ui.Toolbar, null,
        h('span', { className: 'badge badge--' + estado.color, dot: true }, estado.txt),
        bloqueantes ? h('span', { className: 'badge badge--danger', dot: true }, bloqueantes + ' bloqueante' + (bloqueantes > 1 ? 's' : '')) : null,
        ajustadas ? h('span', { className: 'badge badge--info', dot: true }, ajustadas + ' ajustadas por vos') : null,
        h('div', { className: 'spacer' }),
        h(ui.Button, { variant: 'primary', onClick: function () { irA('#/asignacion-real'); }, icon: '→' }, 'Ir a la asignación')),

      resumen ? h(ui.Card, null, h('div', { className: 'resumen-row' },
        h(ui.StatCard, { label: 'Cobertura', value: cobertura + '%', tone: cobertura >= 95 ? 'ok' : 'warn' }),
        h(ui.StatCard, { label: 'Rutas del día', value: resumen.rutas }),
        h(ui.StatCard, { label: 'Asignadas', value: resumen.asignadas }),
        h(ui.StatCard, { label: 'Sin cubrir', value: resumen.sinCubrir || 0, tone: resumen.sinCubrir ? 'warn' : 'ok' }),
        window.CR.canSeeCosts ? h(ui.StatCard, { label: 'Costo del día', value: money(resumen.costoTotal) }) : null)) : null,

      resumen ? h(ui.Card, null, h('div', { className: 'resumen-row' },
        h(ui.StatCard, { label: 'Km totales', value: resumen.kmTotal }),
        h(ui.StatCard, { label: 'Choferes usados', value: choferes }),
        h(ui.StatCard, { label: 'BackUp manual', value: resumen.backupManual || 0 }),

        resumen.desestimadas ? h(ui.StatCard, { label: 'Desestimadas', value: resumen.desestimadas, sub: 'no se hacen: MELI las cubre' }) : null,
        h(ui.StatCard, { label: 'Ajustadas por vos', value: ajustadas }),
        h(ui.StatCard, { label: 'Confirmadas', value: confirmadas }))) : null,

      h(ui.Card, { title: 'Notificaciones y ACKs', actions: h(ui.Button, { variant: 'ghost', size: 'sm', onClick: function () { irA('#/tablero-acks'); } }, 'Abrir tablero') },
        acks ? h('div', { className: 'resumen-row' },
          h(ui.StatCard, { label: 'Notificadas', value: acks.notificados || 0 }),
          h(ui.StatCard, { label: 'Con ok', value: acks.conOk || 0, tone: 'ok' }),
          h(ui.StatCard, { label: 'Sin ok', value: acks.sinOk || 0, tone: acks.sinOk ? 'danger' : 'ok' }))
          : h('p', { className: 'muted' }, backendOn ? 'No hay datos de ACK para la jornada actual.' : 'Conectá el backend para consultar notificaciones reales.')),

      h(ui.Card, { title: 'Alertas — qué conviene mirar' },
        !alertas.length
          ? h('div', { className: 'disc disc--ok' }, h('span', { className: 'disc__done' }, '✓ Sin alertas: la programación está limpia.'))
          : alertas.map(function (a, i) {
            return h('div', { key: i, className: 'alerta alerta--' + a.meta.sev },
              h('span', { className: 'alerta__n' }, a.n),
              h('div', { style: { flex: 1, minWidth: 0 } },
                h('b', null, a.meta.titulo),
                h('div', { className: 'muted', style: { fontSize: 13 } }, a.meta.que),
                a.ejemplos.length ? h('div', { className: 'alerta__ej' },
                  a.ejemplos.map(function (d, j) { return h('div', { key: j }, '· ' + (d.idRuta ? d.idRuta + ': ' : '') + (d.detalle || '')); })) : null),
              h(ui.Button, { variant: a.meta.bloqueante ? 'primary' : 'ghost', size: 'sm', onClick: function () { irA('#/asignacion-real'); } }, a.meta.accion));
          })),

      h(ui.Card, { title: 'Mapa de rutas por zona', actions: h('span', { className: 'muted', style: { fontSize: 12 } }, 'Tamaño = cantidad de rutas · zoom con la rueda') },
        h(window.CR.MapaReal, { rutas: rutas })));
  }

  window.CR.screens = window.CR.screens || {};
  window.CR.screens.DashboardReal = DashboardReal;
})();
