








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

  var money = function (n) { return window.CR.money ? window.CR.money(n) : ('$' + Number(n || 0).toLocaleString('es-AR')); };






  var CONCEPTOS = [
    { value: 'km_excedido', label: 'Adicional por km', tipo: 'adicional', area: 'operaciones' },
    { value: 'paquetes_perdidos', label: 'Descuento por paquetes perdidos', tipo: 'penalidad', area: 'liquidaciones' },
    { value: 'penalidad_early', label: 'Penalidad Early (−15%)', tipo: 'penalidad', area: 'liquidaciones', pct: 15 },
    { value: 'penalidad_late', label: 'Penalidad Late (−10%)', tipo: 'penalidad', area: 'liquidaciones', pct: 10 },
    { value: 'otro', label: 'Otro', tipo: null, area: 'operaciones' }
  ];
  var SIGNOS = [
    { value: 'adicional', label: '+ Suma (adicional)' },
    { value: 'penalidad', label: '− Resta (descuento)' }
  ];
  function conceptoDe(v) { return CONCEPTOS.filter(function (x) { return x.value === v; })[0] || CONCEPTOS[0]; }





  function backupQueNoSalio(ruta) {
    if (!ruta) return null;
    if (String(ruta.servicio || '').trim().toUpperCase() !== 'BACKUP') return null;
    if (ruta.salio === 'si') return null;
    return ruta.salio === 'no'
      ? 'Este Back Up no salió: no corresponde penalidad Early ni Late. Ya cobra el 50% de la tarifa.'
      : 'Este Back Up no tiene marcado si salió. Marcalo en Asignar rutas para poder aplicar Early o Late.';
  }

  var VACIO = { concepto: 'km_excedido', tipo: 'adicional', area: 'operaciones',
    monto: '', kmExcedidos: '', escalon: '', cantidad: '', nota: '' };

  function AjustesRuta(props) {
    var ui = window.CR.ui;
    var ruta = props.ruta;
    var lsState = useState([]); var lista = lsState[0], setLista = lsState[1];
    var fState = useState(VACIO); var form = fState[0], setForm = fState[1];
    var bState = useState(false); var busy = bState[0], setBusy = bState[1];
    var eState = useState(''); var err = eState[0], setErr = eState[1];
    var sState = useState(null); var sugerido = sState[0], setSugerido = sState[1];

    function recargar() {
      if (!ruta) return;
      window.CR.backend.rutaAjustes(ruta.id)
        .then(setLista)
        .catch(function () { setErr('No pudimos leer los ajustes de esta ruta.'); });
    }
    useEffect(function () { setLista([]); setForm(VACIO); setErr(''); setSugerido(null); recargar(); },
      [ruta && ruta.id]);

    // Al escribir los km excedidos preguntamos qué escalón le toca. Si la tabla no está cargada, la
    // respuesta lo dice y el monto queda a mano — no inventamos el número.
    useEffect(function () {
      var km = Number(form.kmExcedidos);
      if (form.concepto !== 'km_excedido' || !(km > 0)) { setSugerido(null); return; }
      var vivo = true;
      window.CR.backend.escalonAdicional(km, ruta && ruta.fecha, ruta && ruta.tipo_vehiculo).then(function (s) {
        if (!vivo) return;
        setSugerido(s);
        if (s && s.escalon) {
          setForm(function (f) {
            var n = Object.assign({}, f, { escalon: String(s.escalon) });









            var hayTabla = !!(s.opciones && s.opciones.length);
            if (s.monto != null && (hayTabla || !f.monto)) n.monto = String(s.monto);
            return n;
          });
        }
      }).catch(function () { if (vivo) setSugerido(null); });
      return function () { vivo = false; };
      // El tipo de unidad va en las dependencias: define QUE tarifa aplica, así que dos rutas de
      // la misma fecha con unidades distintas tienen que volver a consultar.
    }, [form.kmExcedidos, form.concepto, ruta && ruta.fecha, ruta && ruta.tipo_vehiculo]);

    function elegirConcepto(v) {
      var c = conceptoDe(v);
      setForm(Object.assign({}, VACIO, { concepto: v, tipo: c.tipo || 'adicional', area: c.area }));
      setSugerido(null); setErr('');
    }

    function guardar() {
      setErr('');
      var c = conceptoDe(form.concepto);
      // El filtro del desplegable no alcanza: el concepto puede haber quedado elegido de antes.
      // Igual el servidor lo rechaza — esto es para no hacerle dar la vuelta al operador.
      if (c.pct) { var bloq = backupQueNoSalio(ruta); if (bloq) return setErr(bloq); }
      var monto = Number(form.monto);
      // En early/late el monto NO lo manda la pantalla: lo calcula el servidor sobre la tarifa.
      // Pedirlo acá sería reabrir la puerta por la que entró el error de $8.250 del 10/08.
      if (!c.pct && !(monto > 0)) {
        return setErr('Poné el monto. Un ajuste en $0 no cambia nada y ensucia la ruta.');
      }
      if (form.concepto === 'km_excedido' && !form.escalon) {
        return setErr('Falta el escalón. Sin eso no se puede explicar el adicional cuando lo reclamen.');
      }
      setBusy(true);
      window.CR.backend.cargarRutaAjuste({
        rutaId: ruta.id, tipo: form.tipo, concepto: form.concepto,
        monto: c.pct ? null : monto,
        escalon: form.escalon ? Number(form.escalon) : null,
        kmExcedidos: form.kmExcedidos ? Number(form.kmExcedidos) : null,
        cantidad: form.cantidad ? Number(form.cantidad) : null,
        area: form.area, nota: form.nota || null
      }).then(function () {
        setForm(VACIO); setSugerido(null); recargar();
        props.onCambio && props.onCambio();
      }).catch(function (e) { setErr(e.message || 'No se pudo guardar.'); })
        .finally(function () { setBusy(false); });
    }

    function anular(a) {
      var motivo = window.prompt('¿Por qué se anula este ' + a.tipo + ' de ' + money(a.monto) + '?\n' +
        'Queda registrado en el historial de la ruta.');
      if (motivo == null) return;
      if (String(motivo).trim().length < 3) return setErr('El motivo no puede quedar vacío.');
      setBusy(true); setErr('');
      window.CR.backend.anularRutaAjuste(a.id, String(motivo).trim())
        .then(function () { recargar(); props.onCambio && props.onCambio(); })
        .catch(function (e) { setErr(e.message || 'No se pudo anular.'); })
        .finally(function () { setBusy(false); });
    }

    if (!ruta) return null;
    // Si es un Back Up que no salió (o sin marcar), Early/Late no se ofrecen y se dice por qué.
    var bloqueoBackup = backupQueNoSalio(ruta);
    var CONCEPTOS_VISIBLES = bloqueoBackup ? CONCEPTOS.filter(function (c) { return !c.pct; }) : CONCEPTOS;

    var vivos = lista.filter(function (a) { return !a.anulado; });
    var sumaAd = vivos.filter(function (a) { return a.tipo === 'adicional'; })
      .reduce(function (s, a) { return s + a.monto; }, 0);
    var sumaPe = vivos.filter(function (a) { return a.tipo === 'penalidad'; })
      .reduce(function (s, a) { return s + a.monto; }, 0);

    return h(ui.Modal, {
      open: true, onClose: props.onClose,
      title: 'Ajustes de ' + (ruta.cabecera || 'la ruta')
    },
      h('p', { className: 'muted' },
        (ruta.patente || 's/patente') + ' · ' + (ruta.chofer_nombre || 's/chofer') + ' · ' + (ruta.fecha || '')),
      h('div', { className: 'resumen-row' },
        h(ui.StatCard, { label: 'Costo de la ruta', value: money(ruta.costo) }),
        h(ui.StatCard, { label: 'Adicionales', value: money(sumaAd), tone: sumaAd ? 'ok' : null }),
        h(ui.StatCard, { label: 'Penalidades', value: money(sumaPe), tone: sumaPe ? 'warn' : null }),
        h(ui.StatCard, { label: 'Total', value: money(Number(ruta.costo || 0) + sumaAd - sumaPe) })),

      err ? h('p', { className: 'error', role: 'alert' }, err) : null,

      lista.length ? h('table', { className: 'tabla tabla--compacta', style: { marginTop: 12 } },
        h('thead', null, h('tr', null,
          h('th', null, 'Concepto'), h('th', null, 'Detalle'), h('th', { style: { textAlign: 'right' } }, 'Monto'),
          h('th', null, 'Área'), h('th', null, 'Cargó'), h('th', null, ''))),
        h('tbody', null, lista.map(function (a) {
          var muerto = !!a.anulado;
          return h('tr', { key: a.id, style: muerto ? { opacity: 0.5 } : null },
            h('td', null, muerto ? h('s', null, etiquetaConcepto(a)) : etiquetaConcepto(a)),
            h('td', { className: 'muted' }, detalleDe(a) + (muerto ? ' · anulado: ' + (a.motivo_anulacion || '') : '')),
            h('td', { style: { textAlign: 'right' } },
              (a.tipo === 'penalidad' ? '− ' : '+ ') + money(a.monto)),
            h('td', { className: 'muted' }, a.area),
            h('td', { className: 'muted' }, (a.cargado_por || '—') + ' · ' + a.creado),
            h('td', null, muerto ? null : h('button', {
              className: 'btn btn--ghost btn--sm', disabled: busy,
              onClick: function () { anular(a); }
            }, 'Anular')));
        }))) : h('p', { className: 'muted', style: { marginTop: 12 } }, 'Esta ruta todavía no tiene ajustes.'),

      h('h4', { style: { marginTop: 18 } }, 'Cargar un ajuste'),
      h('div', { className: 'form-row' },
        h(ui.Field, { label: 'Concepto' },
          h(ui.Select, {
            value: form.concepto, options: CONCEPTOS_VISIBLES, onChange: elegirConcepto, disabled: busy
          })),
        form.concepto === 'km_excedido' ? h(ui.Field, { label: 'Km por encima de 100' },
          h(ui.Input, {
            type: 'number', value: form.kmExcedidos, placeholder: 'ej. 12', disabled: busy,
            onChange: function (v) { setForm(Object.assign({}, form, { kmExcedidos: v })); }
          })) : null,






        form.concepto === 'km_excedido' ? h(ui.Field, { label: 'Escalón' },
          h(ui.Select, {
            value: form.escalon, placeholder: 'Elegí', disabled: busy,
            options: (sugerido && sugerido.opciones && sugerido.opciones.length
              ? sugerido.opciones.map(function (o) {
                return { value: String(o.escalon), label: 'Escalón ' + o.escalon + ' · ' + o.rango + ' km · ' + money(o.monto) };
              })
              : [{ value: '1', label: 'Escalón 1' }, { value: '2', label: 'Escalón 2' }, { value: '3', label: 'Escalón 3' }]),
            onChange: function (v) {
              var op = (sugerido && sugerido.opciones || []).find(function (o) { return String(o.escalon) === String(v); });
              // El monto lo pone el escalón elegido, no el teclado.
              setForm(Object.assign({}, form, { escalon: v }, op ? { monto: String(op.monto) } : {}));
            }
          })) : null,
        form.concepto === 'paquetes_perdidos' ? h(ui.Field, { label: 'Paquetes' },
          h(ui.Input, {
            type: 'number', value: form.cantidad, placeholder: 'ej. 3', disabled: busy,
            onChange: function (v) { setForm(Object.assign({}, form, { cantidad: v })); }
          })) : null,
        // El signo aparece SÓLO en "Otro". En el resto lo fija el concepto, y ahora también la base.
        form.concepto === 'otro' ? h(ui.Field, { label: '¿Suma o resta?' },
          h(ui.Select, {
            value: form.tipo, options: SIGNOS, disabled: busy,
            onChange: function (v) { setForm(Object.assign({}, form, { tipo: v })); }
          })) : null,
        // Early/Late no llevan campo de monto: lo calcula el servidor sobre la tarifa de la ruta.
        conceptoDe(form.concepto).pct ? null : (function () {



          var deTabla = form.concepto === 'km_excedido'
            && !!(sugerido && sugerido.opciones && sugerido.opciones.length);
          return h(ui.Field, { label: deTabla ? 'Monto (según el escalón)' : 'Monto' },
            h(ui.Input, {
              type: 'number', value: form.monto, placeholder: '0',
              disabled: busy || deTabla, readOnly: deTabla,
              title: deTabla ? 'Sale de la tarifa del escalón para esta unidad. Cambiá el escalón para cambiarlo.' : '',
              onChange: function (v) { if (!deTabla) setForm(Object.assign({}, form, { monto: v })); }
            }),
            deTabla && sugerido.familia
              ? h('p', { className: 'muted', style: { marginTop: 4 } },
                'Tarifa de ' + (sugerido.familia === 'CHASIS' ? 'chasis' : 'camioneta') + '.')
              : null);
        })(),
        h(ui.Field, { label: 'Nota (opcional)' },
          h(ui.Input, {
            value: form.nota, placeholder: 'lo que haga falta aclarar', disabled: busy,
            onChange: function (v) { setForm(Object.assign({}, form, { nota: v })); }
          }))),

      // Qué va a descontar, ANTES de guardar. El número final lo calcula el servidor en Postgres
      // sobre `costo` (numeric, redondeo exacto); esto es la misma cuenta para que el operador vea
      // lo que va a pasar y no tenga que confiar. Si la ruta no tiene tarifa, se dice — el
      // porcentaje de 0 es 0 y un ajuste en $0 ensucia la ruta sin cambiar nada.
      // Por qué faltan Early y Late en el desplegable. Sin esto, el operador ve una lista más corta
      // que ayer y no tiene forma de saber si es un error de la pantalla o una regla del negocio.
      bloqueoBackup ? h('p', { className: 'alerta alerta--media', role: 'note' }, bloqueoBackup) : null,

      conceptoDe(form.concepto).pct ? h('p', { className: 'muted' },
        Number(ruta.costo) > 0
          ? ('Descuenta el ' + conceptoDe(form.concepto).pct + '% de la tarifa de la ruta ('
             + money(ruta.costo) + ', sin contar el adicional por km): '
             + money(Math.round(Number(ruta.costo) * conceptoDe(form.concepto).pct) / 100)
             + '. El monto lo calcula el sistema, no se escribe a mano.')
          : 'Esta ruta no tiene tarifa cargada, así que el porcentaje daría $0. Revisá el costo antes de aplicar la penalidad.'
      ) : null,

      // Dos motivos distintos para que el monto vaya a mano, y conviene no confundirlos: que falte
      // la tabla es transitorio; que no se reconozca la unidad es un dato de la flota a corregir.
      sugerido && sugerido.sinTipoUnidad ? h('p', { className: 'alerta alerta--media' },
        'No reconozco el tipo de unidad de esta ruta' +
        (sugerido.tipoRecibido ? ' ("' + sugerido.tipoRecibido + '")' : ' (viene vacío)') +
        ', y la tarifa del adicional depende de si es chasis o camioneta. El monto va a mano. ' +
        'Si la unidad está mal cargada en la flota, corregirla hace que el sistema lo proponga solo.') : null,
      sugerido && sugerido.sinTabla && !sugerido.sinTipoUnidad ? h('p', { className: 'muted' },
        'Todavía no está cargada la tabla de escalones' +
        (sugerido.familia ? ' para ' + sugerido.familia : '') + ', así que el monto va a mano. ' +
        'Elegí igual el escalón: cuando carguemos la tabla, este ajuste ya va a estar clasificado.') : null,
      sugerido && !sugerido.sinTabla && sugerido.escalon ? h('p', { className: 'muted' },
        (sugerido.familia ? 'Tarifa ' + sugerido.familia + ' · ' : '') +
        'Escalón ' + sugerido.escalon + ' (' + sugerido.rango + ' km): ' + money(sugerido.monto) +
        (sugerido.porKm ? ' — ' + money(sugerido.unitario) + ' por km' : ' — fijo por ruta') +
        '. Podés cambiarlo si el caso es distinto.') : null,

      h('div', { className: 'toolbar', style: { marginTop: 12 } },
        h('button', { className: 'btn btn--primary', disabled: busy, onClick: guardar },
          busy ? 'Guardando…' : 'Agregar ajuste'),
        h('button', { className: 'btn btn--ghost', disabled: busy, onClick: props.onClose }, 'Cerrar')));
  }

  function etiquetaConcepto(a) {
    var c = CONCEPTOS.filter(function (x) { return x.value === a.concepto; })[0];
    return c ? c.label : a.concepto;
  }
  function detalleDe(a) {
    var p = [];
    // El % va PRIMERO y sale de la fila, no de la constante de hoy: si mañana el 15% pasa a ser
    // otro, los ajustes viejos tienen que seguir explicando con qué regla se calcularon.
    if (a.porcentaje != null) p.push(a.porcentaje + '% de la tarifa');
    if (a.escalon) p.push('escalón ' + a.escalon);
    if (a.km_excedidos != null) p.push(a.km_excedidos + ' km de más');
    if (a.cantidad != null) p.push(a.cantidad + ' paquetes');
    if (a.nota) p.push(a.nota);
    return p.join(' · ') || '—';
  }

  window.CR.screens.AjustesRuta = AjustesRuta;
})();
