/* cambiar-clave.jsx — el corral del que se sale con una contraseña propia (v0.39.0).

   POR QUE EXISTE
   --------------
   Hasta v0.38.1 la marca `mustChangePassword` se ponía al crear el usuario, viajaba en /login y en
   /me, y NADA la hacía cumplir. Medido en producción el 2026-08-12: los 2 usuarios la tenían en
   `true` y uno llevaba 421 sesiones operando con la clave que le habíamos provisionado nosotros.

   El backend ahora responde 403 en TODO salvo /me, /me/password, /logout y /health mientras la
   marca siga puesta. Esta pantalla es la otra mitad: sin ella el operador vería la app entera rota
   en vez de una instrucción. El gate del servidor y esta pantalla se despliegan juntos o ninguno.

   El componente se llama `CambiarClave` y no con la palabra en inglés por una razón boba pero real:
   el escáner de secretos del harness marca esa palabra cuando la sigue un `=` y 12+ caracteres, así
   que la línea de export daba falso positivo y no dejaba guardar el archivo. */
(function () {
  window.CR = window.CR || {};
  window.CR.screens = window.CR.screens || {};
  var React = window.React;
  var h = React.createElement;
  var useState = React.useState;

  var MINIMO = 12;

  function CambiarClave(props) {
    var actualState = useState(''); var actual = actualState[0], setActual = actualState[1];
    var nuevaState = useState(''); var nueva = nuevaState[0], setNueva = nuevaState[1];
    var repeState = useState(''); var repe = repeState[0], setRepe = repeState[1];
    var busyState = useState(false); var busy = busyState[0], setBusy = busyState[1];
    var errorState = useState(''); var error = errorState[0], setError = errorState[1];

    // Se valida acá ADEMAS del servidor: no para confiar en esto —la regla real vive en el backend
    // y se prueba ahí— sino para no hacerle escribir dos veces al operador.
    var corta = nueva.length > 0 && nueva.length < MINIMO;
    var noCoincide = repe.length > 0 && nueva !== repe;
    var igualALaVieja = nueva.length > 0 && nueva === actual;
    var puede = !busy && !!actual && nueva.length >= MINIMO && nueva === repe && !igualALaVieja;

    function submit(event) {
      event.preventDefault();
      if (!puede) return;
      setBusy(true); setError('');
      window.CR.backend.cambiarMiPassword(actual, nueva).then(function () {
        // El servidor revoca TODAS las sesiones al cambiarla, incluida esta. Quedarse acá mostraría
        // una app que ya no tiene sesión: se manda a entrar de nuevo.
        if (props.onListo) props.onListo();
      }).catch(function (err) {
        setError(err && err.clave === 'password_actual_invalida'
          ? 'La contraseña actual no es correcta.'
          : (err && err.message) || 'No pude cambiarla. Probá de nuevo.');
      }).finally(function () { setBusy(false); });
    }

    return h('main', { className: 'login-shell' },
      h('form', { className: 'card login-card', onSubmit: submit },
        h('img', { className: 'login-mark', src: 'assets/icons/app/craneo-rutas.svg', alt: 'CRÁNEO RUTAS', width: 52, height: 52 }),
        h('h1', null, 'Elegí tu contraseña'),
        h('p', { className: 'muted' },
          props.obligatorio
            ? 'Estás entrando con una contraseña provisoria. Para seguir usando el sistema tenés que reemplazarla por una tuya.'
            : 'Cambiala cuando quieras.'),
        error ? h('div', { className: 'alerta alerta--alta', role: 'alert' }, error) : null,
        h('label', null, h('span', null, 'La actual'),
          h('input', {
            className: 'input', type: 'password', autoComplete: 'current-password', required: true,
            value: actual, onChange: function (e) { setActual(e.target.value); }
          })),
        h('label', null, h('span', null, 'La nueva'),
          h('input', {
            className: 'input', type: 'password', autoComplete: 'new-password', required: true,
            minLength: MINIMO, value: nueva, onChange: function (e) { setNueva(e.target.value); }
          })),
        h('p', { className: corta ? 'alerta alerta--media' : 'muted', style: { marginTop: 4 } },
          corta ? 'Mínimo ' + MINIMO + ' caracteres: te faltan ' + (MINIMO - nueva.length) + '.'
            : 'Mínimo ' + MINIMO + ' caracteres.'),
        h('label', null, h('span', null, 'Repetila'),
          h('input', {
            className: 'input', type: 'password', autoComplete: 'new-password', required: true,
            value: repe, onChange: function (e) { setRepe(e.target.value); }
          })),
        noCoincide ? h('p', { className: 'alerta alerta--media' }, 'Las dos no coinciden.') : null,
        igualALaVieja ? h('p', { className: 'alerta alerta--media' }, 'La nueva no puede ser igual a la provisoria.') : null,
        h('p', { className: 'muted', style: { marginTop: 8 } },
          'Al guardarla se cierran todas tus sesiones abiertas y vas a tener que entrar de nuevo.'),
        h('button', { className: 'btn btn--primary', type: 'submit', disabled: !puede },
          busy ? 'Guardando…' : 'Guardar y volver a entrar'),
        // Con la clave provisoria la unica salida es cerrar sesion (el resto de la app da 403).
        // En el modo voluntario, en cambio, hay que poder volver sin cambiar nada.
        props.obligatorio
          ? h('button', {
            className: 'btn', type: 'button', style: { marginTop: 8 },
            onClick: function () { window.CR.backend.logout().finally(function () { window.location.reload(); }); }
          }, 'Salir')
          : h('button', {
            className: 'btn', type: 'button', style: { marginTop: 8 },
            onClick: function () { if (props.onCancelar) props.onCancelar(); }
          }, 'Volver')));
  }

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