/* duenos-agencia.jsx — gestión gerente-only respaldada por la API real. */
(function () {
  var React = window.React, h = React.createElement, ui = window.CR.ui;
  var useEffect = React.useEffect, useState = React.useState;

  function nombreAgencia(a) { return a.nombre || a.agencia || 'Agencia sin nombre'; }
  function grupoAgencia(a) { return a.grupoId || a.grupo_id || a.grupoJid || a.grupo_jid || ''; }
  function grupoActivo(a) {
    var valor = a.grupoActivo;
    if (valor === undefined) valor = a.grupo_activo;
    if (valor === undefined) valor = a.activo;
    return valor !== false;
  }
  function identidadDueno(d) {
    if (d.id !== undefined && d.id !== null) return 'id:' + d.id;
    return 'contacto:' + (d.senderLid || d.sender_lid || '') + '|' + (d.telKey || d.tel_key || d.telefono || '');
  }
  function resumenAprobacion(r) {
    var aprobadas = Number(r && r.rutasAprobadas) || 0;
    var yaAprobadas = Number(r && r.rutasYaAprobadas) || 0;
    var motivo = r && r.motivo ? String(r.motivo) : 'sin_motivo_informado';
    if (aprobadas > 0) return 'Éxito: ' + aprobadas + ' ruta(s) recién aprobada(s); ' + yaAprobadas + ' ya estaba(n) aprobada(s). Motivo: ' + motivo + '.';
    if (yaAprobadas > 0) return 'Sin cambios: 0 rutas recién aprobadas; ' + yaAprobadas + ' ya estaba(n) aprobada(s). Motivo: ' + motivo + '.';
    return 'Sin cambios: no se auto-aprobaron rutas (0 recién aprobadas; 0 ya aprobadas). Motivo: ' + motivo + '.';
  }





  var SIN_FILTRO = { agencia: '', grupo: '', tipo: '', duenos: '', estado: '' };
  var ETIQUETA = { agencia: 'Agencia', grupo: 'Grupo', tipo: 'Tipo', duenos: 'Dueños', estado: 'Estado' };

  // Que se compara en cada columna. El grupo y los dueños se filtran por su ESTADO, no por el jid ni
  // por el nombre: "sin grupo vinculado" y "sin dueño" son los cortes que de verdad se buscan.
  function valorDe(campo, a, duenos) {
    if (campo === 'agencia') return nombreAgencia(a);
    if (campo === 'tipo') return (a.tipoActual || a.tipo || 'particular') === 'agencia' ? 'Agencia' : 'Particular';
    if (campo === 'grupo') {
      if (!grupoAgencia(a)) return 'Sin grupo vinculado';
      return grupoActivo(a) ? 'Grupo activo' : 'Vinculado · inactivo';
    }
    if (campo === 'duenos') {
      return (duenos[nombreAgencia(a)] || []).length ? 'Con dueño' : 'Sin dueño';
    }
    // `activa` viene undefined para las que nunca pasaron por la tabla: se asumen activas.
    if (campo === 'estado') return a.activa === false ? 'Desactivada' : 'Activa';
    return '';
  }

  function pasaFiltro(a, filtro, duenos, salvo) {
    return Object.keys(SIN_FILTRO).every(function (k) {
      if (k === salvo || !filtro[k]) return true;
      return valorDe(k, a, duenos) === filtro[k];
    });
  }

  function DuenosAgencia(props) {
    var as = useState([]), agencias = as[0], setAgencias = as[1];
    var ds = useState({}), duenos = ds[0], setDuenos = ds[1];
    var bs = useState(true), busy = bs[0], setBusy = bs[1];
    var es = useState(''), error = es[0], setError = es[1];
    var ms = useState(''), mensaje = ms[0], setMensaje = ms[1];
    var fs = useState(null), form = fs[0], setForm = fs[1];
    var aps = useState(null), aprobacion = aps[0], setAprobacion = aps[1];
    var fls = useState(SIN_FILTRO), filtro = fls[0], setFiltro = fls[1];
    var nvs = useState(null), nueva = nvs[0], setNueva = nvs[1];
    var rns = useState(null), renombre = rns[0], setRenombre = rns[1];
    var dss = useState(null), baja = dss[0], setBaja = dss[1];

    var hayFiltro = Object.keys(SIN_FILTRO).some(function (k) { return !!filtro[k]; });
    var visibles = agencias.filter(function (a) { return pasaFiltro(a, filtro, duenos); });
    // opciones en cascada: para cada columna, los valores que quedan con los OTROS filtros puestos
    function opcionesDe(campo) {
      var vistos = {}, out = [];
      agencias.forEach(function (a) {
        if (!pasaFiltro(a, filtro, duenos, campo)) return;
        var v = valorDe(campo, a, duenos);
        if (v && !vistos[v]) { vistos[v] = true; out.push(v); }
      });
      return out.sort(function (x, y) { return x.localeCompare(y, 'es'); });
    }

    function cargar() {
      setBusy(true); setError('');
      // se piden TODAS, incluidas las desactivadas: el filtro de Estado decide que se muestra,
      // asi una agencia desactivada nunca desaparece sin que se pueda ir a buscarla.
      return window.CR.backend.agencias(true).then(function (lista) {
        setAgencias(lista);
        return Promise.all(lista.map(function (a) {
          var key = nombreAgencia(a);
          return window.CR.backend.grupoDuenos(grupoAgencia(a), key)
            .then(function (items) { return { key: key, items: items }; })
            .catch(function () { return { key: key, items: [] }; });
        }));
      }).then(function (resultados) {
        var mapa = {};
        resultados.forEach(function (r) { mapa[r.key] = r.items; });
        setDuenos(mapa);
      }).catch(function (e) { setError(e.message); }).then(function () { setBusy(false); });
    }
    useEffect(function () { cargar(); }, []);

    function guardarTipo(a, tipo) {
      var key = nombreAgencia(a), actuales = duenos[key] || [];
      setBusy(true); setError(''); setMensaje('');
      window.CR.backend.guardarGrupoConfig({
        grupoId: grupoAgencia(a), tipo: tipo,
        duenos: actuales.map(function (d) {
          return { nombre: d.nombre, telefono: d.telefono || d.telKey || d.tel_key, senderLid: d.senderLid || d.sender_lid };
        })
      }).then(function () { setMensaje('Listo — el grupo quedó marcado como ' + tipo + '.'); return cargar(); })
        .catch(function (e) { setError(e.message); setBusy(false); });
    }
    function agregar() {
      var lid = (form.senderLid || '').trim(), telefono = (form.telefono || '').trim();
      setBusy(true); setError(''); setMensaje('');
      window.CR.backend.agregarGrupoDueno({
        agencia: nombreAgencia(form.agencia), grupoId: grupoAgencia(form.agencia) || undefined,
        nombre: form.nombre.trim(), senderLid: lid || undefined, telefono: telefono || undefined
      }).then(function (r) {
        setMensaje((lid || telefono) + ' quedó como dueño de ' + nombreAgencia(form.agencia) + '. ' + resumenAprobacion(r));
        setForm(null); return cargar();
      }).catch(function (e) { setError(e.message); setBusy(false); });
    }
    function aprobarManual() {
      var motivo = (aprobacion.motivo || '').trim();
      if (!motivo) return;
      setBusy(true); setError(''); setMensaje('');
      window.CR.backend.aprobarGrupoManual({ grupoId: grupoAgencia(aprobacion.agencia), motivo: motivo })
        .then(function (r) {
          setMensaje('Respaldo manual procesado. ' + resumenAprobacion(r));
          setAprobacion(null); return cargar();
        }).catch(function (e) { setError(e.message); setBusy(false); });
    }
    function quitar(a, d) {
      if (!window.confirm('¿Quitar a ' + d.nombre + ' como dueño de ' + nombreAgencia(a) + '?')) return;
      var identidadQuitada = identidadDueno(d);
      var restantes = (duenos[nombreAgencia(a)] || []).filter(function (x) { return identidadDueno(x) !== identidadQuitada; });
      setBusy(true); setError(''); setMensaje('');
      window.CR.backend.guardarGrupoConfig({
        grupoId: grupoAgencia(a), tipo: a.tipoActual || a.tipo || 'particular',
        duenos: restantes.map(function (x) {
          return { nombre: x.nombre, telefono: x.telefono || x.telKey || x.tel_key, senderLid: x.senderLid || x.sender_lid };
        })
      }).then(function () { setMensaje('Dueño quitado del grupo.'); return cargar(); })
        .catch(function (e) { setError(e.message); setBusy(false); });
    }

    function crearAgencia() {
      setBusy(true); setError(''); setMensaje('');
      window.CR.backend.crearAgencia((nueva.nombre || '').trim())
        .then(function () { setMensaje('Agencia creada. Ya podés vincularle un grupo y sus dueños.'); setNueva(null); return cargar(); })
        .catch(function (e) { setError(e.message); setBusy(false); });
    }
    function desactivar() {
      setBusy(true); setError(''); setMensaje('');
      window.CR.backend.desactivarAgencia(nombreAgencia(baja.agencia), (baja.motivo || '').trim())
        .then(function () {
          setMensaje('Agencia desactivada. No se borró nada: sus choferes, dueños e historial siguen.');
          setBaja(null); return cargar();
        }).catch(function (e) { setError(e.message); setBusy(false); });
    }
    function reactivar(a) {
      setBusy(true); setError(''); setMensaje('');
      window.CR.backend.reactivarAgencia(nombreAgencia(a))
        .then(function () { setMensaje('Agencia reactivada.'); return cargar(); })
        .catch(function (e) { setError(e.message); setBusy(false); });
    }
    function renombrar() {
      setBusy(true); setError(''); setMensaje('');
      var de = nombreAgencia(renombre.agencia);
      window.CR.backend.renombrarAgencia(de, (renombre.nombre || '').trim())
        .then(function (r) {
          // se dice cuantos choferes se movieron: es una operacion en lote, no un rename
          setMensaje('Renombrada. Se movieron ' + (r.choferes || 0) + ' chofer(es) a "' +
            (renombre.nombre || '').trim().toUpperCase() + '". El historial ya cerrado conserva el nombre anterior.');
          setRenombre(null); return cargar();
        }).catch(function (e) { setError(e.message); setBusy(false); });
    }

    /* El gate por rol salio de aca el 21/08: quien llega a esta pantalla ya paso por el router,
       que consulta las secciones publicadas por el servidor. Ver `screens/historial.jsx`. */
    return h('div', null,
      h(ui.Page, { title: 'Dueños de Agencia', subtitle: 'Responsables autorizados para aprobar todas las rutas de su agencia.' }),
      error ? h('div', { className: 'alerta alerta--alta', role: 'alert' }, error) : null,
      mensaje ? h('div', { className: 'alerta alerta--baja', role: 'status' }, mensaje) : null,
      agencias.length ? h(ui.Card, null,
        h('div', { className: 'toolbar' },
          h(ui.Field, { label: 'Agencia' },
            h(ui.Select, { value: filtro.agencia, placeholder: 'Todas', 'aria-label': 'Filtrar por agencia',
              onChange: function (v) { setFiltro(Object.assign({}, filtro, { agencia: v })); },
              options: opcionesDe('agencia') })),
          h(ui.Field, { label: 'Grupo' },
            h(ui.Select, { value: filtro.grupo, placeholder: 'Todos', 'aria-label': 'Filtrar por estado del grupo',
              onChange: function (v) { setFiltro(Object.assign({}, filtro, { grupo: v })); },
              options: opcionesDe('grupo') })),
          h(ui.Field, { label: 'Tipo' },
            h(ui.Select, { value: filtro.tipo, placeholder: 'Todos', 'aria-label': 'Filtrar por tipo',
              onChange: function (v) { setFiltro(Object.assign({}, filtro, { tipo: v })); },
              options: opcionesDe('tipo') })),
          h(ui.Field, { label: 'Dueños' },
            h(ui.Select, { value: filtro.duenos, placeholder: 'Todos', 'aria-label': 'Filtrar por dueños',
              onChange: function (v) { setFiltro(Object.assign({}, filtro, { duenos: v })); },
              options: opcionesDe('duenos') })),
          h(ui.Field, { label: 'Estado' },
            h(ui.Select, { value: filtro.estado, placeholder: 'Todas', 'aria-label': 'Filtrar por estado',
              onChange: function (v) { setFiltro(Object.assign({}, filtro, { estado: v })); },
              options: opcionesDe('estado') })),
          h(ui.Button, { variant: 'primary', size: 'sm', disabled: busy,
            onClick: function () { setNueva({ nombre: '' }); } }, '+ Nueva agencia')),
        hayFiltro ? h('div', { style: { display: 'flex', gap: 8, flexWrap: 'wrap', marginTop: 8 } },
          Object.keys(SIN_FILTRO).filter(function (k) { return !!filtro[k]; }).map(function (k) {
            return h('span', { key: k, className: 'chip-filtro' },
              ETIQUETA[k] + ': ' + filtro[k],
              h('button', { type: 'button', title: 'Quitar este filtro',
                'aria-label': 'Quitar el filtro de ' + ETIQUETA[k],
                onClick: function () { var n = Object.assign({}, filtro); n[k] = ''; setFiltro(n); } }, '\u2715'));
          }).concat([
            h('span', { key: '_n', className: 'muted', style: { alignSelf: 'center' } },
              visibles.length + ' de ' + agencias.length),
            h('button', { key: '_todas', className: 'btn btn--ghost btn--sm',
              onClick: function () { setFiltro(SIN_FILTRO); } }, 'Ver todas')
          ])) : null) : null,

      h(ui.Card, { title: 'Agencias y responsables' }, h(ui.DataTable, {
        rows: visibles, rowKey: 'nombre',
        empty: busy ? 'Cargando agencias…'
          : (hayFiltro ? 'Ninguna agencia coincide con el filtro' : 'No hay agencias en FLOTA.'),
        columns: [
          { key: 'nombre', label: 'Agencia', render: function (a) {
            // `origenGrupo`: la fila NO viene de una agencia escrita en los choferes — es un GRUPO
            // de agencia que ninguna agencia reclama (sus choferes figuran como PARTICULAR). Antes
            // no aparecia y su dueno quedaba inalcanzable. Se avisa para que no parezca una agencia
            // duplicada: es el grupo, listado para poder completarle el responsable.
            var etiqueta = a.origenGrupo
              ? h('div', null, nombreAgencia(a),
                  h('div', { className: 'muted', style: { fontSize: 12 } },
                    'grupo de WhatsApp · sin agencia asociada en los choferes'))
              : nombreAgencia(a);
            if (a.activa !== false) return etiqueta;
            // desactivada: se muestra tachada y CON EL MOTIVO. Una agencia que desaparece sin
            // explicacion es justo lo que se quiso evitar.
            return h('div', null, h('s', null, nombreAgencia(a)), ' ',
              h(ui.Badge, { color: 'neutral' }, 'Desactivada'),
              a.motivoDesactivacion ? h('div', { className: 'muted', style: { fontSize: 12 } },
                a.motivoDesactivacion + (a.desactivadaEn ? ' · ' + a.desactivadaEn : '')) : null);
          } },
          { key: 'grupo', label: 'Grupo', render: function (a) {
            var grupo = grupoAgencia(a);
            if (!grupo) return h(ui.Badge, { color: 'danger' }, 'Sin grupo vinculado');
            return h('div', null, h('div', null, grupo),
              grupoActivo(a)
                ? h(ui.Badge, { color: 'ok' }, 'Activo')
                : h(ui.Badge, { color: 'neutral' }, 'Vinculado · inactivo'));
          } },
          { key: 'tipo', label: 'Tipo', render: function (a) {
            var tipo = a.tipoActual || a.tipo || 'particular';
            return h('div', { style: { display: 'flex', gap: 6, flexWrap: 'wrap' } },
              h(ui.Badge, { color: tipo === 'agencia' ? 'ok' : 'neutral' }, tipo === 'agencia' ? 'Agencia' : 'Particular'),
              h(ui.Button, { size: 'sm', variant: 'ghost', disabled: busy || !grupoAgencia(a) || tipo === 'agencia', onClick: function () { guardarTipo(a, 'agencia'); } }, 'Marcar agencia'),
              h(ui.Button, { size: 'sm', variant: 'ghost', disabled: busy || !grupoAgencia(a) || tipo === 'particular', onClick: function () { guardarTipo(a, 'particular'); } }, 'Marcar particular'));
          } },
          { key: 'duenos', label: 'Dueños', render: function (a) {
            var items = duenos[nombreAgencia(a)] || [];
            return items.length ? h('div', null, items.map(function (d) { return h('div', { key: identidadDueno(d), style: { marginBottom: 6 } }, h('b', null, d.nombre), ' · ', d.senderLid || d.sender_lid || d.telefono || d.telKey || d.tel_key, ' ', h(ui.Button, { size: 'sm', variant: 'ghost', disabled: busy, onClick: function () { quitar(a, d); } }, 'Quitar')); })) : h(ui.Badge, { color: 'danger' }, 'Pendiente · sin dueño');
          } },
          { key: 'accion', label: 'Acciones', render: function (a) { return h('div', { style: { display: 'flex', gap: 6, flexWrap: 'wrap' } },
            h(ui.Button, { size: 'sm', disabled: busy || !grupoAgencia(a), onClick: function () { setForm({ agencia: a, nombre: '', senderLid: '', telefono: '' }); } }, 'Agregar dueño'),
            h(ui.Button, { size: 'sm', variant: 'ghost', disabled: busy || !grupoAgencia(a) || (a.tipoActual || a.tipo) !== 'agencia', onClick: function () { setAprobacion({ agencia: a, motivo: '' }); } }, 'Aprobar rutas manualmente'),
            h(ui.Button, { size: 'sm', variant: 'ghost', onClick: function () { window.location.hash = '#/tablero-acks'; } }, 'Capturar del próximo mensaje'),
            h(ui.Button, { size: 'sm', variant: 'ghost', disabled: busy,
              onClick: function () { setRenombre({ agencia: a, nombre: nombreAgencia(a) }); } }, 'Renombrar'),
            a.activa === false
              ? h(ui.Button, { size: 'sm', variant: 'ghost', disabled: busy,
                  onClick: function () { reactivar(a); } }, 'Reactivar')
              : h(ui.Button, { size: 'sm', variant: 'ghost', disabled: busy,
                  onClick: function () { setBaja({ agencia: a, motivo: '' }); } }, 'Desactivar')); } }
        ]
      })),
      h(ui.Modal, { open: !!form, title: form ? 'Agregar dueño · ' + nombreAgencia(form.agencia) : 'Agregar dueño', onClose: function () { setForm(null); }, footer: h('div', null,
        h(ui.Button, { variant: 'ghost', onClick: function () { setForm(null); } }, 'Cancelar'),
        h(ui.Button, { variant: 'primary', disabled: busy || !form || !form.nombre.trim() || (!form.senderLid.trim() && !form.telefono.trim()), onClick: agregar }, 'Registrar dueño')) },
        h(ui.Field, { label: 'Nombre' }, h(ui.Input, { value: form && form.nombre || '', onChange: function (v) { setForm(Object.assign({}, form, { nombre: v })); }, placeholder: 'Nombre y apellido' })),
        h(ui.Field, { label: 'LID de WhatsApp' }, h(ui.Input, { value: form && form.senderLid || '', onChange: function (v) { setForm(Object.assign({}, form, { senderLid: v })); }, placeholder: '123456789@lid' })),
        h(ui.Field, { label: 'Teléfono (alternativa)' }, h(ui.Input, { value: form && form.telefono || '', onChange: function (v) { setForm(Object.assign({}, form, { telefono: v })); }, placeholder: '11 1234 5678' }))),
      h(ui.Modal, { open: !!nueva, title: 'Nueva agencia', onClose: function () { setNueva(null); }, footer: h('div', null,
        h(ui.Button, { variant: 'ghost', onClick: function () { setNueva(null); } }, 'Cancelar'),
        h(ui.Button, { variant: 'primary', disabled: busy || !nueva || !(nueva.nombre || '').trim(), onClick: crearAgencia }, 'Crear')) },
        h('p', { className: 'muted' }, 'Podés crearla ahora aunque todavía no tenga choferes ni grupo: queda lista para vincularlos después.'),
        h(ui.Field, { label: 'Nombre' }, h(ui.Input, { value: nueva && nueva.nombre || '',
          onChange: function (v) { setNueva(Object.assign({}, nueva, { nombre: v })); }, placeholder: 'Ej.: TRANSPORTES DEL SUR' }))),

      h(ui.Modal, { open: !!renombre, title: renombre ? 'Renombrar ' + nombreAgencia(renombre.agencia) : 'Renombrar', onClose: function () { setRenombre(null); }, footer: h('div', null,
        h(ui.Button, { variant: 'ghost', onClick: function () { setRenombre(null); } }, 'Cancelar'),
        h(ui.Button, { variant: 'primary', disabled: busy || !renombre || !(renombre.nombre || '').trim()
          || (renombre.nombre || '').trim().toUpperCase() === nombreAgencia(renombre.agencia), onClick: renombrar }, 'Renombrar')) },
        renombre ? h('div', { className: 'alerta alerta--media' },
          'Esto cambia la agencia de ' + (renombre.agencia.cantidadChoferes || 0) + ' chofer(es). ' +
          'El historial ya cerrado conserva el nombre anterior — eso es a propósito: una liquidación emitida no se reescribe.') : null,
        h(ui.Field, { label: 'Nombre nuevo' }, h(ui.Input, { value: renombre && renombre.nombre || '',
          onChange: function (v) { setRenombre(Object.assign({}, renombre, { nombre: v })); } }))),

      h(ui.Modal, { open: !!baja, title: baja ? 'Desactivar ' + nombreAgencia(baja.agencia) : 'Desactivar', onClose: function () { setBaja(null); }, footer: h('div', null,
        h(ui.Button, { variant: 'ghost', onClick: function () { setBaja(null); } }, 'Cancelar'),
        h(ui.Button, { variant: 'primary', disabled: busy || !baja || (baja.motivo || '').trim().length < 3, onClick: desactivar }, 'Desactivar')) },
        h('p', { className: 'muted' }, 'No se borra nada. La agencia deja de aparecer en esta pantalla y en los selectores, ' +
          'pero sus choferes siguen operando y el historial la sigue nombrando. Se puede reactivar cuando quieras.'),
        h(ui.Field, { label: 'Motivo (obligatorio)' }, h(ui.Input, { value: baja && baja.motivo || '',
          onChange: function (v) { setBaja(Object.assign({}, baja, { motivo: v })); }, placeholder: 'Ej.: dejó de operar con nosotros' }))),

      h(ui.Modal, { open: !!aprobacion, title: aprobacion ? 'Aprobación manual · ' + nombreAgencia(aprobacion.agencia) : 'Aprobación manual', onClose: function () { setAprobacion(null); }, footer: h('div', null,
        h(ui.Button, { variant: 'ghost', onClick: function () { setAprobacion(null); } }, 'Cancelar'),
        h(ui.Button, { variant: 'primary', disabled: busy || !aprobacion || !(aprobacion.motivo || '').trim(), onClick: aprobarManual }, 'Aprobar rutas')) },
        h('p', { className: 'muted' }, 'Usá este respaldo sólo cuando la aprobación retroactiva no corresponda. El backend decide qué rutas son elegibles.'),
        h(ui.Field, { label: 'Motivo obligatorio' }, h(ui.Input, { value: aprobacion && aprobacion.motivo || '', onChange: function (v) { setAprobacion(Object.assign({}, aprobacion, { motivo: v })); }, placeholder: 'Ej.: confirmación verificada por teléfono' }))));
  }
  window.CR.screens = window.CR.screens || {};
  window.CR.screens.DuenosAgencia = DuenosAgencia;
})();
