
























(function () {
  var h = React.createElement;
  var useState = React.useState, useEffect = React.useEffect;
  var ui = window.CR.ui;

  var money = function (n) {
    if (n == null) return '—';
    return '$' + Number(n).toLocaleString('es-AR', { maximumFractionDigits: 0 });
  };

  /* Postgres devuelve `numeric` como texto con punto y Excel es-AR usa coma decimal: con el punto
     lee la columna como TEXTO y el total de la planilla no suma. Se convierte al escribir el CSV,
     no antes — en pantalla el formateo lo hace `money`. Misma funcion que en Estado de Negocio y
     en la exportacion de liquidacion. */
  var numeroCsv = function (v) {
    if (v === null || v === undefined || v === '') return '';
    var s = String(v);
    return /^-?\d+(\.\d+)?$/.test(s) ? s.replace('.', ',') : s;
  };
  var siNo = function (v) { return v ? 'Si' : 'No'; };





















  var CSV_TARIFAS = [
    { key: 'patente', label: 'Patente' },
    { key: 'chofer', label: 'Chofer' },
    { key: 'unidad', label: 'Unidad' },
    { key: 'agencia', label: 'Agencia' },
    { key: 'activa', label: 'Activa en flota', csv: function (r) { return siNo(r.activa); } },
    { key: 'sinTarifa', label: 'Tarifa cargada', csv: function (r) { return siNo(!r.sinTarifa); } },
    { key: 'monto', label: 'Tarifa del módulo', plata: true, csv: function (r) { return numeroCsv(r.monto); } },
    { key: 'desde', label: 'Vigente desde' },
    { key: 'cambios', label: 'Cambios de tarifa', csv: function (r) { return numeroCsv(r.cambios); } },
    { key: 'rutas', label: 'Rutas en el período', csv: function (r) { return numeroCsv(r.rutas); } },
    { key: 'minimo', label: 'Liquidado mínimo', plata: true, csv: function (r) { return numeroCsv(r.minimo); } },
    { key: 'maximo', label: 'Liquidado máximo', plata: true, csv: function (r) { return numeroCsv(r.maximo); } },
    /* Sin esta columna, `minimo` y `maximo` iguales no distinguen "cobro siempre lo mismo" de
       "hizo una sola ruta": son dos cosas distintas para decidir si la tarifa esta bien. */
    { key: 'mismoCostoSiempre', label: 'Mismo costo siempre', csv: function (r) {
      return r.sinRutas ? '' : siNo(r.mismoCostoSiempre); } },



    { key: 'diferencia', label: 'Diferencia (módulo menos liquidado)', plata: true,
      csv: function (r) { return numeroCsv(r.diferencia); } },
    /* Un vacio en DIFERENCIA no dice si la patente no trabajo, si no tiene tarifa o si cobro varios
       precios. Sin el motivo, las tres se leen igual y el control masivo se traba en la primera. */
    { key: 'porQueNoSeCompara', label: 'Por qué no se compara', csv: function (r) {
      if (r.diferencia != null) return '';
      if (r.sinRutas) return 'No trabajó en el período';
      if (r.sinTarifa) return 'No hay tarifa cargada para comparar';
      if (!r.mismoCostoSiempre) return 'Cobró más de un precio: un número contra un rango no se compara';
      return '';
    } }
  ];
  /* Se resuelve AL LLAMAR y no al cargar el modulo: `window.CR.canSeeCosts` lo escribe `app.jsx`
     cuando ya hay sesion, y este archivo se carga antes de que exista. Capturarlo arriba dejaria la
     decision tomada con `undefined` para todos — o sea, sin importes para nadie. */
  var columnasCsvTarifas = function () {
    if (window.CR.canSeeCosts) return CSV_TARIFAS;
    return CSV_TARIFAS.filter(function (c) { return !c.plata; });
  };

  function TarifasProveedor() {
    var backendOn = !!(window.CR.backend && window.CR.backend.enabled);
    var filasState = useState(null); var filas = filasState[0], setFilas = filasState[1];
    var busyState = useState(true); var busy = busyState[0], setBusy = busyState[1];
    var errState = useState(null); var error = errState[0], setError = errState[1];
    var okState = useState(null); var ok = okState[0], setOk = okState[1];
    var buscarState = useState(''); var buscar = buscarState[0], setBuscar = buscarState[1];
    var fState = useState(''); var filtro = fState[0], setFiltro = fState[1];
    var edState = useState(null); var editando = edState[0], setEditando = edState[1];

    function refrescar() {
      setBusy(true);
      return window.CR.backend.tarifasProveedor()
        .then(function (r) { setFilas(r.tarifas || []); setError(null); })
        .catch(function (e) { setError(e.message || 'No pudimos traer las tarifas.'); })
        .then(function () { setBusy(false); });
    }

    useEffect(function () {
      if (!backendOn || !window.CR.backend.tarifasProveedor) { setBusy(false); return; }
      refrescar();
    }, [backendOn]);

    if (!backendOn) {
      return h('div', null, h(ui.Page, { title: 'Tarifa de proveedores' }),
        h(ui.Card, null, h(ui.EmptyState, { title: 'Necesito el backend prendido' },
          'Las tarifas por patente se leen del servidor.')));
    }

    var arr = filas || [];
    var plano = function (s) { return String(s == null ? '' : s).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, ''); };
    var q = plano(buscar.trim());
    var visibles = arr.filter(function (r) {
      if (filtro === 'difiere' && !(r.diferencia != null && r.diferencia !== 0)) return false;
      if (filtro === 'sin-tarifa' && !r.sinTarifa) return false;



      if (filtro === 'activas-sin-tarifa' && !(r.sinTarifa && r.activa)) return false;
      if (filtro === 'sin-rutas' && !r.sinRutas) return false;
      if (filtro === 'no-comparable' && (r.sinRutas || r.mismoCostoSiempre)) return false;
      if (!q) return true;
      return [r.patente, r.chofer, r.agencia, r.unidad].some(function (x) { return plano(x).indexOf(q) >= 0; });
    });

    var cuenta = {
      difiere: arr.filter(function (r) { return r.diferencia != null && r.diferencia !== 0; }).length,
      sinTarifa: arr.filter(function (r) { return r.sinTarifa; }).length,
      activasSinTarifa: arr.filter(function (r) { return r.sinTarifa && r.activa; }).length,
      sinRutas: arr.filter(function (r) { return r.sinRutas; }).length,
      noComparable: arr.filter(function (r) { return !r.sinRutas && !r.mismoCostoSiempre; }).length
    };

    /* Una sola definicion de "hay filtro puesto": la usan el contador, el texto del boton y el
       sufijo del archivo. Con tres copias, alcanza con que una se olvide de un filtro nuevo para
       que el archivo diga que trae todo cuando trae una parte. */
    var hayFiltro = !!(q || filtro);
    var verImportes = !!window.CR.canSeeCosts;

    var chips = [
      { key: '', label: 'Todas (' + arr.length + ')' },
      { key: 'difiere', label: 'Difieren (' + cuenta.difiere + ')' },
      { key: 'activas-sin-tarifa', label: 'Activas sin tarifa (' + cuenta.activasSinTarifa + ')' },
      { key: 'sin-tarifa', label: 'Sin tarifa (' + cuenta.sinTarifa + ')' },
      { key: 'sin-rutas', label: 'Sin rutas (' + cuenta.sinRutas + ')' },
      { key: 'no-comparable', label: 'No comparables (' + cuenta.noComparable + ')' }
    ];

    var cols = [
      { key: 'patente', label: 'PATENTE', render: function (r) {
        /* El badge va SOLO cuando falta la tarifa: marcar las 128 activas seria ruido y taparia
           justo a las que hay que cargar. */
        return h('span', null, h('b', null, r.patente),
          (r.activa && r.sinTarifa)
            ? h('span', { className: 'badge badge--danger', style: { fontSize: 10, marginLeft: 6 },
                title: 'Esta unidad esta ACTIVA en Flota (MELI) y todavia no tiene tarifa cargada' }, 'activa')
            : null);
      } },
      { key: 'chofer', label: 'CHOFER', render: function (r) { return r.chofer || '—'; } },
      { key: 'unidad', label: 'UNIDAD', render: function (r) { return r.unidad || '—'; } },
      { key: 'agencia', label: 'AGENCIA', render: function (r) { return r.agencia || '—'; } },
      { key: 'monto', label: 'TARIFA DEL MÓDULO', align: 'right', render: function (r) {
        if (r.sinTarifa) return h('span', { className: 'badge badge--warn', style: { fontSize: 11 } }, 'sin cargar');
        return h('span', null, h('b', null, money(r.monto)),
          h('span', { className: 'muted', style: { fontSize: 11, marginLeft: 6 } },
            'desde ' + (r.desde || '—') + (r.cambios > 1 ? ' · ' + r.cambios + ' cambios' : '')));
      } },
      { key: 'liquidado', label: 'LO QUE SE LIQUIDÓ', align: 'right', render: function (r) {
        if (r.sinRutas) return h('span', { className: 'muted' }, 'sin rutas en el período');
        if (!r.mismoCostoSiempre) {
          /* Rango: la patente cobró más de un precio. Se muestra el rango y NO una diferencia —
             comparar un número del módulo contra un rango no significa nada. */
          return h('span', null, money(r.minimo) + ' a ' + money(r.maximo),
            h('span', { className: 'muted', style: { fontSize: 11, marginLeft: 6 } }, r.rutas + ' rutas'));
        }
        return h('span', null, money(r.minimo),
          h('span', { className: 'muted', style: { fontSize: 11, marginLeft: 6 } }, r.rutas + ' rutas'));
      } },
      { key: 'diferencia', label: 'DIFERENCIA', align: 'right', render: function (r) {
        if (r.diferencia == null) {
          return h('span', { className: 'muted', title: r.sinRutas ? 'No trabajó en el período'
            : r.sinTarifa ? 'No hay tarifa cargada para comparar'
            : 'Cobró más de un precio: un número contra un rango no se puede comparar' }, 'no comparable');
        }
        if (r.diferencia === 0) return h('span', { className: 'badge badge--ok', style: { fontSize: 11 } }, 'coincide');
        var mas = r.diferencia > 0;
        return h('span', { className: 'badge badge--warn', style: { fontSize: 11 },
          title: mas ? 'El módulo pide MÁS de lo que se liquidó' : 'El módulo pide MENOS de lo que se liquidó' },
          (mas ? '+' : '−') + money(Math.abs(r.diferencia)));
      } },
      { key: 'acciones', label: '', render: function (r) {
        return h('button', { type: 'button', className: 'cc__btn',
          onClick: function () { setEditando({ patente: r.patente, monto: r.monto == null ? '' : String(r.monto),
            vigenteDesde: new Date().toISOString().slice(0, 10), nota: '' }); } },
          r.sinTarifa ? 'Cargar' : 'Cambiar');
      } }
    ];

    function guardar() {
      var e = editando;
      var monto = Number(e.monto);
      if (!(monto >= 0) || !isFinite(monto)) { setError('El monto tiene que ser un número mayor o igual a 0.'); return; }
      if (!/^\d{4}-\d{2}-\d{2}$/.test(e.vigenteDesde)) { setError('La fecha de vigencia va como AAAA-MM-DD.'); return; }
      setBusy(true); setError(null);
      window.CR.backend.guardarTarifaProveedor(e.patente, monto, e.vigenteDesde, e.nota)
        .then(function () {
          setEditando(null);
          setOk('Tarifa de ' + e.patente + ' guardada desde ' + e.vigenteDesde + '.');
          return refrescar();
        })
        .catch(function (err) { setError(err.message || 'No pudimos guardar la tarifa.'); setBusy(false); });
    }

    return h('div', null,
      h(ui.Page, { title: 'Tarifa de proveedores',
        subtitle: 'El costo por patente que le pagamos a cada proveedor, con su vigencia. Cambiar una tarifa acá abre una vigencia nueva y no reescribe lo ya liquidado.' }),

      h(ui.Card, null,
        h('h3', { 'data-novedad': 'pm-tarifa-semi' }, 'El costo se calcula con la tarifa vigente de cada patente'),
        h('p', { style: { margin: 0 } },
          'Buscá la patente y revisá el importe y la fecha desde la que rige. Para SEMI, si falta una tarifa propia aplicable, la ruta queda pendiente de cotización.')),

      error ? h(ui.Card, null, h('div', { className: 'badge badge--danger' }, error)) : null,
      ok ? h(ui.Card, null, h('div', { className: 'badge badge--ok' }, ok)) : null,

      editando ? h(ui.Card, { title: 'Tarifa de ' + editando.patente },
        h('div', { style: { display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'flex-end' } },
          h('label', null, h('span', null, 'Monto'),
            h('input', { className: 'input', type: 'number', min: 0, value: editando.monto,
              onChange: function (ev) { setEditando(Object.assign({}, editando, { monto: ev.target.value })); } })),
          h('label', null, h('span', null, 'Vigente desde'),
            h('input', { className: 'input', type: 'date', value: editando.vigenteDesde,
              onChange: function (ev) { setEditando(Object.assign({}, editando, { vigenteDesde: ev.target.value })); } })),
          h('label', { style: { flex: 1, minWidth: 220 } }, h('span', null, 'Nota (opcional)'),
            h('input', { className: 'input', value: editando.nota, placeholder: 'ej: aumento acordado con el proveedor',
              onChange: function (ev) { setEditando(Object.assign({}, editando, { nota: ev.target.value })); } })),
          h('button', { type: 'button', className: 'btn', disabled: busy, onClick: guardar }, 'Guardar'),
          h('button', { type: 'button', className: 'cc__btn', onClick: function () { setEditando(null); } }, 'Cancelar')),
        h('p', { className: 'muted', style: { fontSize: 12, marginBottom: 0 } },
          'La tarifa anterior se cierra el día previo a la nueva vigencia; no se borra. Por eso una quincena vieja se puede volver a calcular y sigue dando el número que se pagó ese día.')) : null,

      h(ui.Card, { title: 'Tarifas por patente' },
        h('div', { style: { display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center', marginBottom: 12 } },
          h('input', { className: 'input', style: { maxWidth: 320 }, value: buscar,
            placeholder: '🔎 Buscar patente, chofer, agencia…', 'aria-label': 'Buscar en las tarifas',
            onChange: function (ev) { setBuscar(ev.target.value); } }),
          h('div', { className: 'prov-chips', role: 'group', 'aria-label': 'Filtrar tarifas' },
            chips.map(function (c) {
              var activo = filtro === c.key;
              return h('button', { key: c.key || 'todas', type: 'button',
                className: 'rep-chip' + (activo ? ' rep-chip--on' : ''), 'aria-pressed': activo,
                onClick: function () { setFiltro(activo && c.key !== '' ? '' : c.key); } }, c.label);
            })),
          (q || filtro) ? h('span', { className: 'muted', style: { fontSize: 12 } },
            visibles.length + ' de ' + arr.length + ' patentes') : null,
          /* EL BOTON BAJA LO QUE SE ESTA VIENDO, y lo dice en el texto. En Onboarding, «seleccionar
             todos» con filtro puesto marco 119 grupos y no los 3 visibles; aca el dano es mas
             callado —un control de tarifas incompleto que parece la lista entera— asi que la cuenta
             va en el boton y el archivo se llama `-filtrada`. Un CSV se abre solo, fuera de la
             pantalla y sin el contexto del filtro. */
          h('button', { type: 'button', className: 'cc__btn', disabled: busy || !visibles.length,
            'aria-describedby': verImportes ? null : 'prov-excel-sin-importes',
            title: (hayFiltro
              ? 'Baja las ' + visibles.length + ' patentes que estás viendo, no las ' + arr.length + ' de la lista completa'
              : 'Baja las ' + arr.length + ' patentes con su tarifa y la diferencia contra lo liquidado')
              + (verImportes ? '' : ' — sin los importes: tu rol no los recibe del servidor.'),
            onClick: function () {
              window.CR.csv.descargar(
                'craneo-tarifas-proveedor-' + new Date().toISOString().slice(0, 10)
                  + (hayFiltro ? '-filtrada' : '')
                  + (verImportes ? '' : '-sin-importes') + '.csv',
                columnasCsvTarifas(), visibles);
            } },
            '⬇ Excel (' + visibles.length + (hayFiltro ? ' de ' + arr.length : '') + ')'),
          verImportes ? null
            : h('span', { id: 'prov-excel-sin-importes', className: 'muted', role: 'status',
              style: { fontSize: 12 } },
              'El Excel sale SIN los importes (tarifa, liquidado y diferencia): tu rol no los recibe. '
              + 'Lo que sí baja: qué patentes no tienen tarifa cargada y cuáles están activas.')),
        busy ? h('p', { className: 'muted' }, 'Cargando…')
          : h(ui.DataTable, { columns: cols, rows: visibles, rowKey: 'patente',
            empty: (q || filtro) ? 'Ninguna patente coincide con la búsqueda/filtro.' : 'Sin tarifas cargadas' })));
  }

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