/* Condiciones de Primera Milla — configuración operativa por patente.
   Catálogo, permisos, revisiones y filas vienen siempre del servidor. No hay entidades ni acuerdos
   implícitos en el cliente. window.CR.screens.FmCondiciones */
(function () {
  var React = window.React;
  var ui = window.CR.ui;
  var h = React.createElement;
  var useState = React.useState, useEffect = React.useEffect;

  var FRANJA_LABEL = { TODO_DIA: 'Todo el día', MANANA: 'Mañana (inicio antes de 14:00)', TARDE: 'Tarde (inicio desde 14:00)' };
  var SERVICIO_LABEL = { COLECTA: 'Colecta', FULL: 'Full' };

  function uuid() {
    if (window.crypto && window.crypto.randomUUID) return window.crypto.randomUUID();
    var b = new Uint8Array(16); window.crypto.getRandomValues(b); b[6] = (b[6] & 15) | 64; b[8] = (b[8] & 63) | 128;
    var x = Array.prototype.map.call(b, function (n) { return n.toString(16).padStart(2, '0'); }).join('');
    return x.slice(0, 8) + '-' + x.slice(8, 12) + '-' + x.slice(12, 16) + '-' + x.slice(16, 20) + '-' + x.slice(20);
  }
  function plano(v) { return String(v || '').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''); }
  function etiquetaFranja(v) { return FRANJA_LABEL[v] || v || '—'; }
  function etiquetaServicio(v) { return SERVICIO_LABEL[v] || v; }
  function borradorDe(unidad) {
    var c = unidad && unidad.configurada && unidad.condiciones ? unidad.condiciones : null;
    return {
      franja: c ? c.franja : '', servicios: c && Array.isArray(c.servicios) ? c.servicios.slice() : [],
      salidaDiaria: c ? !!c.salidaDiaria : null, permiteDobleCiclo: c ? !!c.permiteDobleCiclo : null
    };
  }
  function boolLabel(v, si, no) { return v === true ? si : v === false ? no : 'Sin definir'; }
  function decimalCanonico(v) { return typeof v === 'string' && /^(0|[1-9]\d*)$/.test(v); }
  function compararDecimal(a, b) {
    if (!decimalCanonico(a) || !decimalCanonico(b)) return null;
    if (a.length !== b.length) return a.length < b.length ? -1 : 1;
    return a === b ? 0 : a < b ? -1 : 1;
  }
  function mismasCondiciones(a, b) {
    if (!a || !b || typeof a !== 'object' || typeof b !== 'object'
      || !Array.isArray(a.servicios) || !Array.isArray(b.servicios)) return false;
    if (a.franja !== b.franja || a.salidaDiaria !== b.salidaDiaria
      || a.permiteDobleCiclo !== b.permiteDobleCiclo || a.servicios.length !== b.servicios.length) return false;
    var aa = a.servicios.slice().sort(), bb = b.servicios.slice().sort();
    return aa.every(function (v, i) { return v === bb[i]; });
  }
  function mismaFilaFm(a, b) {
    return !!a && !!b && a.vehiculoId === b.vehiculoId && a.patente === b.patente
      && a.configurada === b.configurada && a.revision === b.revision
      && mismasCondiciones(a.condiciones, b.condiciones);
  }

  function Skeleton() {
    return h('div', { className: 'fm-skeleton', role: 'status', 'aria-label': 'Cargando condiciones de Primera Milla' },
      h('p', { className: 'muted', style: { margin: 0 } }, 'Leyendo unidades, permisos y condiciones del servidor…'),
      h('div', { className: 'fm-skeleton__bar fm-skeleton__bar--wide' }),
      h('div', { className: 'fm-skeleton__bar' }),
      h('div', { className: 'fm-skeleton__table' }, [0, 1, 2, 3].map(function (i) { return h('div', { key: i, className: 'fm-skeleton__row' }); })));
  }

  function FmCondiciones(props) {
    var backendOn = !!(window.CR.backend && window.CR.backend.enabled);
    var rs = useState(null); var respuesta = rs[0], setRespuesta = rs[1];
    var ls = useState(true); var cargando = ls[0], setCargando = ls[1];
    var es = useState(null); var error = es[0], setError = es[1];
    var aps = useState(false); var sinPermiso = aps[0], setSinPermiso = aps[1];
    var ps = useState(null); var parcial = ps[0], setParcial = ps[1];
    var qs = useState(''); var buscar = qs[0], setBuscar = qs[1];
    var eds = useState(null); var editando = eds[0], setEditando = eds[1];
    var ds = useState(null); var draft = ds[0], setDraft = ds[1];
    var cs = useState(false); var confirmando = cs[0], setConfirmando = cs[1];
    var ss = useState(false); var guardando = ss[0], setGuardando = ss[1];
    var ses = useState(null); var saveError = ses[0], setSaveError = ses[1];
    var cfs = useState(null); var conflicto = cfs[0], setConflicto = cfs[1];
    var ns = useState(null); var aviso = ns[0], setAviso = ns[1];
    var os = useState(null); var operacionId = os[0], setOperacionId = os[1];
    var eps = useState(false); var envioPendiente = eps[0], setEnvioPendiente = eps[1];
    // Una respuesta incierta sólo admite repetir la intención original, nunca otro cuerpo con su UUID.
    var envioPendienteRef = React.useRef(null);
    function liberarEnvio() { envioPendienteRef.current = null; setEnvioPendiente(false); }
    var seq = React.useRef(0);
    var respuestaRef = React.useRef(null);
    var fotoSecuenciaRef = React.useRef(0);
    var permisoEditarRef = React.useRef(false);
    var guardadoSeq = React.useRef(0);
    var guardandoRef = React.useRef(false);
    var intencionEdicionSeq = React.useRef(0);
    var intencionEdicionRef = React.useRef(null);
    var conflictoAdoptadoRef = React.useRef(null);
    var dialogRef = React.useRef(null);
    var confirmTriggerRef = React.useRef(null);
    var editorTriggerRef = React.useRef(null);
    var saveErrorRef = React.useRef(null);

    function invalidarLecturas() {
      ++seq.current;
      setCargando(false);
    }

    function publicarRespuesta(nueva) {
      var secuencia = ++fotoSecuenciaRef.current;
      respuestaRef.current = nueva;
      setRespuesta(nueva);
      return secuencia;
    }

    function revocarEdicion(mensaje, sinAcceso) {
      invalidarLecturas();
      permisoEditarRef.current = false;
      ++guardadoSeq.current;
      setConfirmando(false);
      guardandoRef.current = false;
      setGuardando(false);
      if (sinAcceso) setSinPermiso(true);
      if (mensaje) setSaveError(mensaje);
    }

    function cargar(preservarBorrador) {
      if (!backendOn || !window.CR.backend.condicionesPrimeraMilla) { setCargando(false); return Promise.resolve(false); }
      var s = ++seq.current;
      var intencionAlIniciar = intencionEdicionSeq.current;
      setCargando(true); setError(null); setSinPermiso(false); setParcial(null);
      return window.CR.backend.condicionesPrimeraMilla().then(function (r) {
        if (s !== seq.current) return false;
        if (!r || r.contrato !== 1 || !r.permisos || !r.catalogo || !decimalCanonico(r.generacion) || !Array.isArray(r.unidades)) throw new Error('El servidor devolvió una respuesta incompleta. No se mostraron datos para evitar una configuración falsa.');
        var validas = r.unidades.filter(function (u) { return u && u.vehiculoId && u.patente && Number.isInteger(u.revision); });
        if (validas.length !== r.unidades.length) setParcial('Hay ' + (r.unidades.length - validas.length) + ' unidad(es) con datos incompletos que no se muestran. Recargá o pedí revisión antes de editar.');
        permisoEditarRef.current = r.permisos.editar === true;
        if (!permisoEditarRef.current) {
          ++guardadoSeq.current;
          setConfirmando(false);
          guardandoRef.current = false;
          setGuardando(false);
          if (intencionEdicionRef.current) setSaveError('Tu permiso de edición ya no está vigente. El borrador se conserva en solo lectura y no se enviará ningún cambio.');
        }
        publicarRespuesta(Object.assign({}, r, { unidades: validas }));
        // Una lectura iniciada sin editor no puede destruir una intención abierta mientras esperaba.
        // Cerrar o cambiar de intención es una acción explícita; GET sólo actualiza la foto del servidor.
        if (!preservarBorrador && intencionEdicionSeq.current === intencionAlIniciar && !intencionEdicionRef.current) {
          setEditando(null); setDraft(null); setOperacionId(null); setConflicto(null);
        }
        return true;
      }).catch(function (e) {
        if (s === seq.current) {
          if (e && e.status === 403) revocarEdicion('Tu permiso ya no está vigente. No se envió ningún cambio.', true);
          else setError((e && e.message) || 'No pude cargar las condiciones. Revisá la conexión y probá de nuevo.');
        }
        return false;
      }).then(function (ok) { if (s === seq.current) setCargando(false); return ok; });
    }
    useEffect(function () { cargar(false); return function () { ++seq.current; ++guardadoSeq.current; permisoEditarRef.current = false; guardandoRef.current = false; intencionEdicionRef.current = null; }; }, [backendOn]);

    function controlesDialogo() {
      if (!dialogRef.current) return [];
      return Array.prototype.filter.call(dialogRef.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]'), function (el) {
        return !el.disabled && el.getAttribute('aria-hidden') !== 'true' && el.tabIndex >= 0;
      });
    }
    function cerrarConfirmacion() {
      if (guardandoRef.current) return;
      setConfirmando(false);
    }
    function tecladoDialogo(ev) {
      if (ev.key === 'Escape') {
        if (!guardando) { ev.preventDefault(); ev.stopPropagation(); setConfirmando(false); }
        return;
      }
      if (ev.key !== 'Tab') return;
      var controles = controlesDialogo();
      if (!controles.length) { ev.preventDefault(); if (dialogRef.current) dialogRef.current.focus(); return; }
      var primero = controles[0], ultimo = controles[controles.length - 1];
      if (ev.shiftKey && document.activeElement === primero) { ev.preventDefault(); ultimo.focus(); }
      else if (!ev.shiftKey && document.activeElement === ultimo) { ev.preventDefault(); primero.focus(); }
    }

    function restaurarFoco() {
      var disparador = confirmTriggerRef.current;
      if (disparador && disparador.isConnected && !disparador.disabled) { disparador.focus(); return; }
      window.requestAnimationFrame(function () {
        var errorActual = saveErrorRef.current;
        if (errorActual && errorActual.isConnected) { errorActual.focus(); return; }
        var fila = editorTriggerRef.current;
        if (fila && fila.isConnected && !fila.disabled) fila.focus();
      });
    }
    useEffect(function () {
      if (!confirmando) return undefined;
      function focoEnDialogo(ultimo) {
        var dialogo = dialogRef.current;
        var controles = controlesDialogo();
        if (controles.length) controles[ultimo ? controles.length - 1 : 0].focus();
        else if (dialogo) dialogo.focus();
      }
      function tecladoDocumento(ev) {
        var dialogo = dialogRef.current;
        if (!dialogo) return;
        if (ev.key === 'Escape') {
          ev.preventDefault(); ev.stopPropagation();
          if (ev.stopImmediatePropagation) ev.stopImmediatePropagation();
          if (!guardandoRef.current) setConfirmando(false);
          else focoEnDialogo(false);
          return;
        }
        if (ev.key === 'Tab') {
          var controles = controlesDialogo();
          var dentro = dialogo.contains(document.activeElement);
          if (!controles.length || !dentro || (ev.shiftKey && document.activeElement === controles[0]) || (!ev.shiftKey && document.activeElement === controles[controles.length - 1])) {
            ev.preventDefault(); ev.stopPropagation();
            focoEnDialogo(!!ev.shiftKey);
          }
          return;
        }
        if ((ev.key === 'Enter' || ev.key === ' ') && !dialogo.contains(ev.target)) {
          ev.preventDefault(); ev.stopPropagation();
          if (ev.stopImmediatePropagation) ev.stopImmediatePropagation();
          focoEnDialogo(false);
        }
      }
      function contenerFoco(ev) {
        var dialogo = dialogRef.current;
        if (dialogo && !dialogo.contains(ev.target)) focoEnDialogo(false);
      }
      function bloquearFondo(ev) {
        var dialogo = dialogRef.current;
        if (dialogo && !dialogo.contains(ev.target)) { ev.preventDefault(); ev.stopPropagation(); }
      }
      document.addEventListener('keydown', tecladoDocumento, true);
      document.addEventListener('focusin', contenerFoco, true);
      document.addEventListener('pointerdown', bloquearFondo, true);
      document.addEventListener('click', bloquearFondo, true);
      focoEnDialogo(false);
      return function () {
        document.removeEventListener('keydown', tecladoDocumento, true);
        document.removeEventListener('focusin', contenerFoco, true);
        document.removeEventListener('pointerdown', bloquearFondo, true);
        document.removeEventListener('click', bloquearFondo, true);
        restaurarFoco();
      };
    }, [confirmando]);
    useEffect(function () {
      if (!confirmando) return;
      var controles = controlesDialogo();
      if (controles.length) controles[0].focus();
      else if (dialogRef.current) dialogRef.current.focus();
    }, [confirmando, guardando]);

    function abrir(unidad, ev) {
      if (!permisoEditarRef.current || envioPendienteRef.current) return;
      var token = ++intencionEdicionSeq.current;
      intencionEdicionRef.current = { token: token, patente: unidad.patente };
      conflictoAdoptadoRef.current = null;
      editorTriggerRef.current = ev && ev.currentTarget ? ev.currentTarget : document.activeElement;
      setEditando({ patente: unidad.patente, vehiculoId: unidad.vehiculoId, revision: unidad.revision,
        generacion: respuestaRef.current && respuestaRef.current.generacion, configurada: unidad.configurada,
        fotoSecuencia: fotoSecuenciaRef.current, requiereLectura: false });
      setDraft(borradorDe(unidad)); setOperacionId(uuid()); setSaveError(null); setConflicto(null); setAviso(null); setConfirmando(false);
    }
    function cancelar() {
      if (guardandoRef.current || envioPendienteRef.current) return;
      ++intencionEdicionSeq.current;
      intencionEdicionRef.current = null;
      conflictoAdoptadoRef.current = null;
      setEditando(null); setDraft(null); setOperacionId(null); setSaveError(null); setConflicto(null); setConfirmando(false);
    }
    function cambiar(k, v) { if (!permisoEditarRef.current || envioPendienteRef.current) return; var n = Object.assign({}, draft); n[k] = v; setDraft(n); setSaveError(null); setConflicto(null); conflictoAdoptadoRef.current = null; }
    function toggleServicio(s) {
      var tiene = draft.servicios.indexOf(s) >= 0;
      cambiar('servicios', tiene ? draft.servicios.filter(function (x) { return x !== s; }) : draft.servicios.concat([s]));
    }
    function errorBorrador() {
      if (!draft || !draft.franja) return 'Elegí una franja.';
      if (!draft.servicios.length) return 'Elegí al menos un servicio.';
      if (typeof draft.salidaDiaria !== 'boolean') return 'Indicá si tiene salida diaria de lunes a viernes.';
      if (typeof draft.permiteDobleCiclo !== 'boolean') return 'Indicá si admite doble ciclo.';
      return null;
    }
    function pedirConfirmacion(ev) {
      if (!permisoEditarRef.current) { setSaveError('Tu permiso de edición ya no está vigente. Actualizá antes de guardar.'); return; }
      if (editando && editando.requiereLectura) {
        setSaveError('La operación original fue confirmada, pero la foto vigente no se pudo reconciliar. Actualizá y abrí una edición nueva antes de guardar otra vez.'); return;
      }
      var e = errorBorrador(); if (e) { setSaveError(e); return; }
      confirmTriggerRef.current = ev && ev.currentTarget ? ev.currentTarget : document.activeElement;
      setConfirmando(true); setSaveError(null);
    }
    function guardar() {
      if (guardandoRef.current) return;
      var fotoActual = respuestaRef.current;
      if (!permisoEditarRef.current || !fotoActual || fotoActual.permisos.editar !== true) {
        setConfirmando(false); setSaveError('Tu permiso de edición ya no está vigente. No se envió ningún cambio.'); return;
      }
      var e = errorBorrador(); if (e || !editando) { setSaveError(e || 'No hay una unidad seleccionada.'); return; }
      var tokenGuardado = ++guardadoSeq.current;
      guardandoRef.current = true;
      // Un GET iniciado antes de este intento nunca puede decidir después del PUT.
      invalidarLecturas();
      setGuardando(true); setSaveError(null); setConflicto(null);
      var payload = { revisionEsperada: editando.revision, operacionId: operacionId, condiciones: {
        franja: draft.franja, servicios: draft.servicios.slice(), salidaDiaria: draft.salidaDiaria, permiteDobleCiclo: draft.permiteDobleCiclo
      } };
      var contextoEsperado = { patente: editando.patente, vehiculoId: editando.vehiculoId,
        revision: editando.revision, generacion: editando.generacion };
      if (!envioPendienteRef.current) {
        envioPendienteRef.current = { patente: editando.patente, payload: payload, contexto: contextoEsperado };
        setEnvioPendiente(true);
      }
      var envio = envioPendienteRef.current;
      window.CR.backend.guardarCondicionesPrimeraMilla(envio.patente, envio.payload, envio.contexto).then(function (r) {
        if (tokenGuardado !== guardadoSeq.current || !permisoEditarRef.current) return;
        liberarEnvio();
        invalidarLecturas();
        var actual = respuestaRef.current;
        var huboFotoPosterior = fotoSecuenciaRef.current > editando.fotoSecuencia;
        var publicacion = 'aplicada';
        var requiereLectura = false;
        if (actual && r && r.unidad) {
          var encontrada = false;
          var unidades = actual.unidades.map(function (u) {
            if (u.patente !== r.unidad.patente) return u;
            encontrada = true;
            if (!huboFotoPosterior) return r.unidad;
            if (u.vehiculoId !== r.unidad.vehiculoId) {
              if (u.revision < r.unidad.revision) { publicacion = 'no_verificable'; requiereLectura = true; }
              else publicacion = 'identidad_vigente';
              return u;
            }
            if (u.revision > r.unidad.revision) { publicacion = 'revision_vigente'; return u; }
            if (u.revision === r.unidad.revision) {
              if (!mismaFilaFm(u, r.unidad)) { publicacion = 'no_verificable'; requiereLectura = true; }
              else publicacion = 'equivalente';
              return u;
            }
            return r.unidad;
          });
          if (!encontrada) publicacion = huboFotoPosterior ? 'retirada' : 'no_verificable';
          if (!encontrada && !huboFotoPosterior) requiereLectura = true;
          var generacion = compararDecimal(r.generacion, actual.generacion) >= 0 ? r.generacion : actual.generacion;
          publicarRespuesta(Object.assign({}, actual, { unidades: unidades, generacion: generacion }));
        }
        if (requiereLectura) {
          setAviso('El servidor confirmó la operación original, pero su relación con la foto vigente no es verificable. La foto y el borrador se conservaron.');
          setEditando(Object.assign({}, editando, { requiereLectura: true }));
          setSaveError('Actualizá y abrí una edición nueva para continuar; no se eligió una precedencia por generación.');
          setConfirmando(false);
        } else {
          setAviso(publicacion === 'aplicada'
            ? (r.repetida === true
              ? 'La operación ya estaba registrada. Se conserva la confirmación original; no se reasignó ni notificó nada.'
              : 'Condiciones de ' + editando.patente + ' guardadas. Se aplicarán a nuevas programaciones; no se reasignó ni notificó nada.')
            : (publicacion === 'retirada'
              ? 'La operación original quedó confirmada. Una lectura posterior retiró la patente y no se la volvió a publicar.'
              : 'La operación original quedó confirmada. Se conserva íntegra la foto posterior de Flota; no se reemplazó.'));
          ++intencionEdicionSeq.current;
          intencionEdicionRef.current = null;
          conflictoAdoptadoRef.current = null;
          setEditando(null); setDraft(null); setOperacionId(null); setConfirmando(false);
        }
      }).catch(function (ex) {
        if (tokenGuardado !== guardadoSeq.current) return;
        invalidarLecturas();
        setConfirmando(false);
        if (ex && ex.status === 403) {
          var actual = respuestaRef.current;
          if (actual) publicarRespuesta(Object.assign({}, actual, { permisos: Object.assign({}, actual.permisos, { editar: false }) }));
          revocarEdicion('El servidor revocó el permiso de edición. Tu borrador queda visible en solo lectura; no se informó éxito.', false);
        } else if (ex && ex.status === 409) {
          var intencion = { token: intencionEdicionRef.current && intencionEdicionRef.current.token,
            patente: editando.patente, vehiculoId: editando.vehiculoId, revision: editando.revision,
            generacion: editando.generacion, operacionId: operacionId, fotoSecuencia: editando.fotoSecuencia };
          var validar = window.CR.backend.validarConflictoCondicionesPrimeraMilla;
          var verificacion = typeof validar === 'function'
            ? validar(ex.clave, ex.detalle || null, intencion, respuestaRef.current)
            : { valido: false, motivo: 'validador' };
          if (verificacion.valido === true) liberarEnvio();
          conflictoAdoptadoRef.current = null;
          setConflicto({ clave: ex.clave, detalle: ex.detalle || null, mensaje: ex.message,
            intencion: intencion, verificable: verificacion.valido === true });
          setSaveError(verificacion.valido === true
            ? 'No se guardó: otra edición cambió esta patente. Tu borrador sigue intacto; podés revisar la versión informada.'
            : 'El conflicto no trae una revisión verificable. Tu borrador sigue intacto; la operación y la foto no cambiaron. Actualizá antes de reintentar.');
        } else {
          setSaveError(((ex && ex.message) || 'No pude guardar.') + ' Tu borrador sigue intacto; podés reintentar con la misma operación.');
        }
      }).then(function () {
        if (tokenGuardado === guardadoSeq.current) { guardandoRef.current = false; setGuardando(false); }
      });
    }
    function tomarRevisionActual() {
      if (!permisoEditarRef.current) { setSaveError('Tu permiso de edición ya no está vigente.'); return; }
      if (!conflicto || conflictoAdoptadoRef.current === conflicto) return;
      var intencion = conflicto.intencion;
      var vigente = intencionEdicionRef.current;
      var mismaIntencion = !!intencion && !!vigente && !!editando
        && vigente.token === intencion.token && vigente.patente === intencion.patente
        && editando.patente === intencion.patente && editando.vehiculoId === intencion.vehiculoId
        && editando.revision === intencion.revision && editando.generacion === intencion.generacion
        && operacionId === intencion.operacionId;
      var validar = window.CR.backend.validarConflictoCondicionesPrimeraMilla;
      var verificacion = mismaIntencion && typeof validar === 'function'
        ? validar(conflicto.clave, conflicto.detalle, intencion, respuestaRef.current)
        : { valido: false };
      if (!verificacion.valido) {
        setSaveError('La revisión informada no corresponde de forma verificable a esta unidad. Tu borrador sigue intacto; actualizá antes de reintentar.');
        return;
      }
      conflictoAdoptadoRef.current = conflicto;
      var actual = verificacion.actual;
      var rev = verificacion.revision;
      var foto = respuestaRef.current;
      var generacion = foto && compararDecimal(foto.generacion, verificacion.generacion) > 0
        ? foto.generacion : verificacion.generacion;
      var nuevaSecuencia = fotoSecuenciaRef.current;
      if (foto) nuevaSecuencia = publicarRespuesta(Object.assign({}, foto, { generacion: generacion,
        unidades: foto.unidades.map(function (u) { return u.patente === editando.patente ? actual : u; }) }));
      setEditando(Object.assign({}, editando, { vehiculoId: actual.vehiculoId, revision: rev,
        generacion: generacion, configurada: true, fotoSecuencia: nuevaSecuencia, requiereLectura: false }));
      setOperacionId(uuid()); setConflicto(null); setSaveError('Revisá tu borrador contra la revisión ' + rev + ' y volvé a confirmar. No se guardó todavía.');
    }

    if (!backendOn) return h(ui.Card, null, h(ui.EmptyState, { title: 'Necesito el servidor conectado' }, 'Las condiciones se leen y guardan en la API; no hay una copia local que pueda actuar como autoridad.'));
    if (cargando && !respuesta) return h(Skeleton);
    if (sinPermiso) return h(ui.Card, { className: 'fm-state' },
      h(ui.EmptyState, { title: 'No tenés acceso a estas condiciones' },
        h('span', null, 'Tu sesión no tiene permiso efectivo de Flota para consultar esta sección.'),
        h(ui.Button, { variant: 'ghost', disabled: cargando, onClick: function () { cargar(false); } }, cargando ? 'Actualizando acceso…' : 'Actualizar acceso')));
    if (error && !respuesta) return h(ui.Card, { className: 'fm-state fm-state--error' },
      h('div', { role: 'alert' }, h('b', null, 'No pudimos cargar las condiciones.'), h('p', null, error)),
      h(ui.Button, { variant: 'primary', onClick: function () { cargar(false); } }, 'Reintentar'));
    if (!respuesta || respuesta.permisos.consultar !== true) return h(ui.Card, { className: 'fm-state' },
      h(ui.EmptyState, { title: 'No tenés acceso a estas condiciones' }, 'Tu sesión no tiene permiso efectivo de Flota para consultar esta sección.'));

    var unidades = respuesta.unidades || [];
    var q = plano(buscar.trim());
    var filtradas = unidades.filter(function (u) { return !q || plano(u.patente).indexOf(q) >= 0; });
    var puedeEditar = respuesta.permisos.editar === true && permisoEditarRef.current === true;
    var catalogo = respuesta.catalogo || { franjas: [], servicios: [] };

    return h('section', { className: 'fm-condiciones', 'data-fm-condiciones': 'ready' },
      h(ui.Page, { title: 'Condiciones de Primera Milla', subtitle: 'Acuerdos operativos por patente para nuevas programaciones. Sin configurar conserva la operación actual.' }),
      h('div', { className: 'fm-explainer', role: 'note' },
        h('b', null, 'Vigencia y alcance'),
        h('span', null, 'Se aplicará a nuevas programaciones. La programación actual conserva sus condiciones. Guardar no reasigna rutas, no modifica históricos y no envía mensajes.'),
        h('span', null, 'Salida diaria significa cobertura de programación de lunes a viernes; no confirma una salida efectiva.')),
      parcial ? h('div', { className: 'fm-banner fm-banner--warn', role: 'status' }, parcial) : null,
      error ? h('div', { className: 'fm-banner fm-banner--warn', role: 'status' }, 'La última recarga falló: ' + error + ' Se conserva lo que ya estaba visible.') : null,
      aviso ? h('div', { className: 'fm-banner fm-banner--ok', role: 'status', 'aria-live': 'polite' }, aviso) : null,
      !puedeEditar ? h('div', { className: 'fm-banner', role: 'note' }, 'Consulta de condiciones · solo lectura según permisos efectivos del servidor.') : null,
      h(ui.Card, null,
        h('div', { className: 'fm-toolbar' },
          h('label', { className: 'fm-search' }, h('span', null, 'Buscar por patente'),
            h('input', { className: 'input', type: 'search', value: buscar, placeholder: 'Ej. SINTETICA01',
              onChange: function (ev) { setBuscar(ev.target.value); } })),
          h('span', { className: 'muted', role: 'status' }, filtradas.length + ' de ' + unidades.length + ' unidades'),
          h(ui.Button, { variant: 'ghost', disabled: cargando, onClick: function () { cargar(!!editando); } }, cargando ? 'Actualizando…' : 'Actualizar')),
        !unidades.length ? h(ui.EmptyState, { title: 'No hay unidades de Primera Milla disponibles' },
          h('span', null, 'Cuando la flota operativa tenga unidades de Primera Milla, aparecerán acá. No se crean patentes desde esta sección.'),
          props.onVolverFlota ? h(ui.Button, { variant: 'ghost', onClick: props.onVolverFlota }, 'Volver a Flota') : null) :
        !filtradas.length ? h(ui.EmptyState, { title: 'Ninguna patente coincide' }, 'Probá con otra búsqueda o limpiá el campo.') :
        h('div', { className: 'fm-tablewrap' },
          h('table', { className: 'fm-table' },
            h('thead', null, h('tr', null,
              h('th', null, 'Patente'), h('th', null, 'Estado'), h('th', null, 'Franja'), h('th', null, 'Servicios'),
              h('th', null, 'Salida L–V'), h('th', null, 'Doble ciclo'), h('th', null, 'Revisión'), h('th', null, 'Acción'))),
            h('tbody', null, filtradas.map(function (u) {
              var c = u.condiciones || {};
              return h('tr', { key: u.vehiculoId, 'data-patente': u.patente },
                h('td', null, h('b', null, u.patente)),
                h('td', null, h('span', { className: 'badge badge--' + (u.configurada ? 'ok' : 'neutral') }, u.configurada ? 'Configurada' : 'Sin configurar')),
                h('td', null, u.configurada ? etiquetaFranja(c.franja) : '—'),
                h('td', null, u.configurada ? (c.servicios || []).map(etiquetaServicio).join(' + ') : '—'),
                h('td', null, u.configurada ? (c.salidaDiaria ? 'Sí' : 'No') : '—'),
                h('td', null, u.configurada ? (c.permiteDobleCiclo ? 'Admite' : 'No admite') : '—'),
                h('td', { className: 'tnum' }, u.revision),
                h('td', null, puedeEditar ? h(ui.Button, { size: 'sm', variant: 'ghost', disabled: guardando || envioPendiente,
                  'aria-label': (u.configurada ? 'Editar condiciones de ' : 'Configurar condiciones de ') + u.patente,
                  onClick: function (ev) { abrir(u, ev); } }, u.configurada ? 'Editar' : 'Configurar') : h('span', { className: 'muted' }, 'Solo lectura')));
            }))))),

      editando && draft ? h(ui.Card, { className: 'fm-editor', 'aria-disabled': !puedeEditar, title: (editando.configurada ? 'Editar ' : 'Configurar ') + editando.patente },
        h('p', { className: 'muted' }, editando.configurada
          ? 'Partís de la revisión ' + editando.revision + '. Los cambios no afectan la programación actual.'
          : 'Esta patente no tiene acuerdos. Completá los cuatro campos; no preseleccionamos ninguno.'),
        !puedeEditar ? h('div', { className: 'fm-banner fm-banner--warn', role: 'alert' }, 'Edición inhabilitada por el permiso vigente. Tu borrador se conserva en esta vista y no puede enviarse.') : null,
        envioPendiente ? h('div', { className: 'fm-banner fm-banner--warn', role: 'status' },
          'La confirmación está pendiente. Conservamos el cambio enviado; reintentá la misma operación antes de modificarlo o editar otra patente.') : null,
        h('div', { className: 'fm-form' },
          h('label', null, h('span', null, 'Franja *'),
            h('select', { className: 'input', value: draft.franja, disabled: guardando || envioPendiente || !puedeEditar, onChange: function (ev) { cambiar('franja', ev.target.value); } },
              [h('option', { key: '_', value: '' }, 'Elegir franja…')].concat((catalogo.franjas || []).map(function (f) { return h('option', { key: f, value: f }, etiquetaFranja(f)); })))),
          h('fieldset', { className: 'fm-fieldset', disabled: guardando || envioPendiente || !puedeEditar }, h('legend', null, 'Servicios *'),
            (catalogo.servicios || []).map(function (s) { return h('label', { key: s, className: 'fm-check' },
              h('input', { type: 'checkbox', checked: draft.servicios.indexOf(s) >= 0, onChange: function () { toggleServicio(s); } }),
              h('span', null, etiquetaServicio(s))); })),
          h('label', null, h('span', null, 'Salida diaria L–V *'),
            h('select', { className: 'input', value: draft.salidaDiaria === null ? '' : String(draft.salidaDiaria), disabled: guardando || envioPendiente || !puedeEditar,
              onChange: function (ev) { cambiar('salidaDiaria', ev.target.value === '' ? null : ev.target.value === 'true'); } },
              h('option', { value: '' }, 'Elegir…'), h('option', { value: 'true' }, 'Sí, requiere cobertura'), h('option', { value: 'false' }, 'No'))),
          h('label', null, h('span', null, 'Doble ciclo *'),
            h('select', { className: 'input', value: draft.permiteDobleCiclo === null ? '' : String(draft.permiteDobleCiclo), disabled: guardando || envioPendiente || !puedeEditar,
              onChange: function (ev) { cambiar('permiteDobleCiclo', ev.target.value === '' ? null : ev.target.value === 'true'); } },
              h('option', { value: '' }, 'Elegir…'), h('option', { value: 'true' }, 'Admite doble ciclo'), h('option', { value: 'false' }, 'No admite doble ciclo')))),
        conflicto ? h('div', { className: 'fm-banner fm-banner--warn', role: 'alert' },
          h('b', null, 'Conflicto de edición. '), h('span', null, conflicto.mensaje),
          conflicto.clave === 'revision_desactualizada' && conflicto.detalle && conflicto.detalle.actual
            ? h(ui.Button, { size: 'sm', variant: 'ghost', onClick: tomarRevisionActual }, 'Tomar revisión actual y revisar') :
            h(ui.Button, { size: 'sm', variant: 'ghost', onClick: function () { cargar(true); } }, 'Actualizar sin perder borrador')) : null,
        saveError ? h('div', { className: 'fm-form-error', role: 'alert', tabIndex: -1, ref: saveErrorRef }, saveError) : null,
        h('div', { className: 'fm-actions' },
          h(ui.Button, { variant: 'primary', disabled: guardando || !puedeEditar, onClick: pedirConfirmacion }, guardando ? 'Guardando…' : envioPendiente ? 'Revisar y reintentar' : 'Revisar y guardar'),
          h(ui.Button, { variant: 'ghost', disabled: guardando || envioPendiente, onClick: cancelar }, 'Cancelar'))) : null,

      confirmando && editando && draft && puedeEditar ? h('div', { className: 'fm-confirm-bg', role: 'presentation' },
        h('div', { className: 'fm-confirm', ref: dialogRef, tabIndex: -1, role: 'dialog', 'aria-modal': 'true', 'aria-labelledby': 'fm-confirm-title', onKeyDown: tecladoDialogo },
          h('h3', { id: 'fm-confirm-title' }, 'Confirmar condiciones de ' + editando.patente),
          h('dl', null,
            h('div', null, h('dt', null, 'Franja'), h('dd', null, etiquetaFranja(draft.franja))),
            h('div', null, h('dt', null, 'Servicios'), h('dd', null, draft.servicios.map(etiquetaServicio).join(' + '))),
            h('div', null, h('dt', null, 'Salida L–V'), h('dd', null, boolLabel(draft.salidaDiaria, 'Sí', 'No'))),
            h('div', null, h('dt', null, 'Doble ciclo'), h('dd', null, boolLabel(draft.permiteDobleCiclo, 'Admite', 'No admite')))),
          h('p', null, 'Se aplicará a nuevas programaciones. No reasigna, no toca históricos y no notifica.'),
          h('div', { className: 'fm-actions' },
            h(ui.Button, { variant: 'primary', disabled: guardando, onClick: guardar }, guardando ? 'Guardando…' : 'Confirmar guardado'),
            h(ui.Button, { variant: 'ghost', disabled: guardando, onClick: cerrarConfirmacion }, envioPendiente ? 'Volver al cambio pendiente' : 'Volver a editar')))) : null);
  }

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