(function() {

// ============================================================
// ESTADO
// ============================================================
var estado = {
  expediente: 0,
  segundosRestantes: 60 * 60,
  intervalo: null,
  hipotesis: { H1: 25, H2: 25, H3: 25, H4: 25 },
  decisiones: {},
  tiempos: {},
  evidenciasExaminadas: [],
  ts: {}
};

// ============================================================
// DATOS
// ============================================================

var HIPOTESIS = [
  { id: 'H1', label: 'Fallo tecnol\u00f3gico', color: '#19C4D5' },
  { id: 'H2', label: 'Cultura permisiva', color: '#BFB620' },
  { id: 'H3', label: 'Gobernanza deficiente', color: '#FF751F' },
  { id: 'H4', label: 'Tratamiento il\u00edcito', color: '#002445' }
];

var EVIDENCIAS = {
  'E1A': { H1: -5, H2: 0,  H3: +12, H4: +8  },
  'E1B': { H1: -10,H2: 0,  H3: +15, H4: +5  },
  'E1C': { H1: -15,H2: +20,H3: +5,  H4: +5  },
  'E1D': { H1: 0,  H2: +10,H3: +5,  H4: +10 },
  'E3A': { H1: 0,  H2: +15,H3: +5,  H4: +5  },
  'E3B': { H1: 0,  H2: +10,H3: -5,  H4: -10 },
  'E3C': { H1: 0,  H2: -10,H3: +10, H4: +20 },
  'E4A': { H1: -20,H2: -10,H3: 0,   H4: +35 },
  'E4B': { H1: 0,  H2: +15,H3: 0,   H4: +10 }
};

// ============================================================
// UTILIDADES
// ============================================================

function fmt(s) {
  var m = Math.floor(s / 60), sec = s % 60;
  return (m < 10 ? '0' : '') + m + ':' + (sec < 10 ? '0' : '') + sec;
}

function aplicarEvidencia(id) {
  if (estado.evidenciasExaminadas.indexOf(id) !== -1) return;
  estado.evidenciasExaminadas.push(id);
  var pesos = EVIDENCIAS[id];
  if (!pesos) return;
  var h = estado.hipotesis;
  h.H1 += pesos.H1; h.H2 += pesos.H2; h.H3 += pesos.H3; h.H4 += pesos.H4;
  // Normalizar entre 5 y 90
  var keys = ['H1','H2','H3','H4'];
  for (var i = 0; i < keys.length; i++) {
    if (h[keys[i]] < 5) h[keys[i]] = 5;
    if (h[keys[i]] > 90) h[keys[i]] = 90;
  }
  actualizarBarras();
}

function actualizarBarras() {
  var h = estado.hipotesis;
  var ids = ['H1','H2','H3','H4'];
  for (var i = 0; i < ids.length; i++) {
    var bar = document.getElementById('orh-bar-' + ids[i]);
    var val = document.getElementById('orh-val-' + ids[i]);
    if (bar) bar.style.width = h[ids[i]] + '%';
    if (val) val.textContent = Math.round(h[ids[i]]) + '%';
  }
}

function registrarDecision(key, valor) {
  estado.decisiones[key] = valor;
}

function iniciarTiempo(key) {
  estado.ts[key] = Date.now();
}

function registrarTiempo(key) {
  if (estado.ts[key]) {
    estado.tiempos[key] = Math.round((Date.now() - estado.ts[key]) / 1000);
  }
}

function iniciarCronometro() {
  estado.intervalo = setInterval(function() {
    estado.segundosRestantes--;
    var el = document.getElementById('orh-aud-timer');
    if (el) el.textContent = fmt(estado.segundosRestantes);
    if (estado.segundosRestantes <= 0) {
      clearInterval(estado.intervalo);
      renderTiempoAgotado();
    }
  }, 1000);
}

function detenerCronometro() {
  if (estado.intervalo) clearInterval(estado.intervalo);
}

function tiempoUsado() {
  return 3600 - estado.segundosRestantes;
}

// ============================================================
// RENDER PRINCIPAL
// ============================================================

function render() {
  var c = document.getElementById('orh-auditoria');
  if (!c) return;
  var exp = estado.expediente;
  if (exp === 0) renderIntro(c);
  else if (exp === 1) renderExp1(c);
  else if (exp === 2) renderExp2(c);
  else if (exp === 3) renderExp3(c);
  else if (exp === 4) renderExp4(c);
  else if (exp === 5) renderExp5(c);
  else if (exp === 6) renderResultado(c);
}

// ============================================================
// COMPONENTES COMUNES
// ============================================================

function htmlHeader(titulo, subtitulo) {
  return '<div class="orh-aud-header">' +
    '<div class="orh-aud-header-left">' +
    '<div class="orh-aud-etiqueta">Simulaci\u00f3n de auditor\u00eda</div>' +
    '<div class="orh-aud-titulo-exp">' + titulo + '</div>' +
    (subtitulo ? '<div class="orh-aud-subtitulo-exp">' + subtitulo + '</div>' : '') +
    '</div>' +
    '<div class="orh-aud-timer-wrap"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"vertical-align:-2px\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> <span id="orh-aud-timer">' + fmt(estado.segundosRestantes) + '</span></div>' +
    '</div>';
}

function htmlBarras() {
  var h = estado.hipotesis;
  var ids = ['H1','H2','H3','H4'];
  var labels = ['Fallo tecnol\u00f3gico','Cultura permisiva','Gobernanza deficiente','Tratamiento il\u00edcito'];
  var colors = ['#19C4D5','#BFB620','#FF751F','#002445'];
  var html = '<div class="orh-aud-hipotesis">';
  html += '<div class="orh-aud-hip-titulo">Hip\u00f3tesis activas</div>';
  for (var i = 0; i < ids.length; i++) {
    var val = Math.round(h[ids[i]]);
    html += '<div class="orh-aud-hip-row">';
    html += '<div class="orh-aud-hip-label">' + labels[i] + '</div>';
    html += '<div class="orh-aud-hip-bar-wrap">';
    html += '<div class="orh-aud-hip-bar" id="orh-bar-' + ids[i] + '" style="width:' + val + '%;background:' + colors[i] + '"></div>';
    html += '</div>';
    html += '<div class="orh-aud-hip-val" id="orh-val-' + ids[i] + '">' + val + '%</div>';
    html += '</div>';
  }
  html += '</div>';
  return html;
}

function htmlProgreso(actual) {
  var html = '<div class="orh-aud-progreso">';
  for (var i = 1; i <= 5; i++) {
    var cls = i < actual ? 'orh-aud-paso-ok' : (i === actual ? 'orh-aud-paso-actual' : 'orh-aud-paso-pending');
    html += '<div class="orh-aud-paso ' + cls + '">' + i + '</div>';
    if (i < 5) html += '<div class="orh-aud-paso-line ' + (i < actual ? 'orh-aud-line-ok' : '') + '"></div>';
  }
  html += '</div>';
  return html;
}

function htmlEvidencia(id, icono, titulo, contenido) {
  return '<div class="orh-aud-evidencia" id="ev-' + id + '" data-evid="' + id + '">' +
    '<div class="orh-aud-ev-header">' +
    '<span class="orh-aud-ev-icono">' + icono + '</span>' +
    '<span class="orh-aud-ev-titulo">' + titulo + '</span>' +
    '<span class="orh-aud-ev-arrow" id="arr-' + id + '"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"/></svg></span>' +
    '</div>' +
    '<div class="orh-aud-ev-body" id="evb-' + id + '" style="display:none">' + contenido + '</div>' +
    '</div>';
}

function bindEvidencias(lista) {
  for (var i = 0; i < lista.length; i++) {
    (function(id) {
      var el = document.getElementById('ev-' + id);
      if (!el) return;
      el.addEventListener('click', function() {
        var body = document.getElementById('evb-' + id);
        var arr = document.getElementById('arr-' + id);
        if (!body) return;
        var abierto = body.style.display !== 'none';
        body.style.display = abierto ? 'none' : 'block';
        if (arr) arr.innerHTML = abierto ? '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"/></svg>' : '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"/></svg>';
        el.classList.toggle('orh-aud-ev-abierta', !abierto);
        if (!abierto) aplicarEvidencia(id);
      });
    })(lista[i]);
  }
}

function htmlOpciones(opciones, key, callback) {
  var html = '<div class="orh-aud-opciones" id="opts-' + key + '">';
  for (var i = 0; i < opciones.length; i++) {
    html += '<button class="orh-aud-opcion" data-key="' + key + '" data-val="' + i + '">' + opciones[i] + '</button>';
  }
  html += '</div>';
  return html;
}

function bindOpciones(key, callback, conTiempo) {
  var wrap = document.getElementById('opts-' + key);
  if (!wrap) return;
  if (conTiempo) iniciarTiempo(key);
  var bts = wrap.querySelectorAll('.orh-aud-opcion');
  for (var i = 0; i < bts.length; i++) {
    bts[i].addEventListener('click', function() {
      if (conTiempo) registrarTiempo(key);
      var val = parseInt(this.getAttribute('data-val'));
      registrarDecision(key, val);
      var allBts = wrap.querySelectorAll('.orh-aud-opcion');
      for (var j = 0; j < allBts.length; j++) allBts[j].disabled = true;
      this.classList.add('orh-aud-opcion-sel');
      if (callback) callback(val);
    });
  }
}

function btnSiguiente(texto, fn) {
  var btn = document.createElement('button');
  btn.className = 'orh-aud-btn-primary';
  btn.innerHTML = texto || 'Continuar investigaci\u00f3n &#8594;';
  btn.addEventListener('click', fn);
  return btn;
}

// ============================================================
// INTRO
// ============================================================

function renderIntro(c) {
  var html = '<div class="orh-aud-intro">';

  // Hero
  html += '<div class="orh-aud-intro-hero">';
  html += '<img class="orh-aud-intro-hero-img" src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkyMCIgaGVpZ2h0PSI5MDAiIHZpZXdCb3g9IjAgMCAxOTIwIDkwMCIgcm9sZT0iaW1nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8dGl0bGU+UG9ydGFkYSBlc2NhcGUgcm9vbSBwcm90ZWNjaW9uIGRlIGRhdG9zIFJSSEg8L3RpdGxlPgo8cmVjdCB3aWR0aD0iMTkyMCIgaGVpZ2h0PSI5MDAiIGZpbGw9IiMwMDI0NDUiLz4KCjwhLS0gQ2lyY3Vsb3MgY29uY2VudHJpY29zIGJpZW4gY2VudHJhZG9zIC0tPgo8Y2lyY2xlIGN4PSI5NjAiIGN5PSI0NTAiIHI9IjM4MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMTlDNEQ1IiBzdHJva2Utd2lkdGg9IjAuOSIgb3BhY2l0eT0iMC4xOCIvPgo8Y2lyY2xlIGN4PSI5NjAiIGN5PSI0NTAiIHI9IjI5MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMTlDNEQ1IiBzdHJva2Utd2lkdGg9IjAuOSIgb3BhY2l0eT0iMC4yMiIvPgo8Y2lyY2xlIGN4PSI5NjAiIGN5PSI0NTAiIHI9IjIwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY3NTFGIiBzdHJva2Utd2lkdGg9IjAuOCIgb3BhY2l0eT0iMC4yNSIvPgo8Y2lyY2xlIGN4PSI5NjAiIGN5PSI0NTAiIHI9IjExMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQkZCNjIwIiBzdHJva2Utd2lkdGg9IjAuOCIgb3BhY2l0eT0iMC4zIi8+Cgo8IS0tIExpbmVhcyBkaWFnb25hbGVzIHN1dGlsZXMgLS0+CjxsaW5lIHgxPSIyMDAiIHkxPSIwIiB4Mj0iMTcyMCIgeTI9IjkwMCIgc3Ryb2tlPSIjMTlDNEQ1IiBzdHJva2Utd2lkdGg9IjAuNSIgb3BhY2l0eT0iMC4wNyIvPgo8bGluZSB4MT0iMjAwIiB5MT0iOTAwIiB4Mj0iMTcyMCIgeTI9IjAiIHN0cm9rZT0iIzE5QzRENSIgc3Ryb2tlLXdpZHRoPSIwLjUiIG9wYWNpdHk9IjAuMDciLz4KPGxpbmUgeDE9Ijk2MCIgeTE9IjAiIHgyPSI5NjAiIHkyPSI5MDAiIHN0cm9rZT0iI0ZGNzUxRiIgc3Ryb2tlLXdpZHRoPSIwLjUiIG9wYWNpdHk9IjAuMDYiLz4KPGxpbmUgeDE9IjAiIHkxPSI0NTAiIHgyPSIxOTIwIiB5Mj0iNDUwIiBzdHJva2U9IiNGRjc1MUYiIHN0cm9rZS13aWR0aD0iMC41IiBvcGFjaXR5PSIwLjA2Ii8+Cgo8IS0tIENBTkRBRE8gQUJJRVJUTyBjZW50cmFkbyBjb24gbWFyZ2VuIGdlbmVyb3NvIC0tPgo8IS0tIEN1ZXJwbyBjYW5kYWRvIC0tPgo8cmVjdCB4PSI4NTYiIHk9IjM5MCIgd2lkdGg9IjIwOCIgaGVpZ2h0PSIxNzgiIHJ4PSIxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjMiLz4KPHJlY3QgeD0iODcyIiB5PSI0MDYiIHdpZHRoPSIxNzYiIGhlaWdodD0iMTQ2IiByeD0iOSIgZmlsbD0iIzAwMTgzMCIgb3BhY2l0eT0iMC42Ii8+Cgo8IS0tIEFyY28gYWJpZXJ0byDigJQgZGVzcGxhemFkbyBhcnJpYmEgaXpxdWllcmRhLCBzdWVsdG8gLS0+CjxwYXRoIGQ9Ik04NTYgMzkwIEw4NTYgMjk4IFE4NTYgMjAwIDkxMiAxNzggUTk2OCAxNTYgMTAwMCAxOTYgUTEwMjIgMjI2IDEwMTggMjYyIiBmaWxsPSJub25lIiBzdHJva2U9IiNGRjc1MUYiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cgo8IS0tIENlcnJhZHVyYSAtLT4KPGNpcmNsZSBjeD0iOTYwIiBjeT0iNDYyIiByPSIyOCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMTlDNEQ1IiBzdHJva2Utd2lkdGg9IjIuOCIvPgo8Y2lyY2xlIGN4PSI5NjAiIGN5PSI0NjIiIHI9IjEyIiBmaWxsPSIjMTlDNEQ1IiBvcGFjaXR5PSIwLjkiLz4KPGxpbmUgeDE9Ijk2MCIgeTE9IjQ3NCIgeDI9Ijk2MCIgeTI9IjUwOCIgc3Ryb2tlPSIjMTlDNEQ1IiBzdHJva2Utd2lkdGg9IjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgoKPCEtLSBQdW50b3MgZXNxdWluYSBjYW5kYWRvIC0tPgo8Y2lyY2xlIGN4PSI4NTYiIGN5PSIzOTAiIHI9IjUiIGZpbGw9IiNCRkI2MjAiLz4KPGNpcmNsZSBjeD0iMTA2NCIgY3k9IjM5MCIgcj0iNSIgZmlsbD0iI0JGQjYyMCIvPgo8Y2lyY2xlIGN4PSI4NTYiIGN5PSI1NjgiIHI9IjUiIGZpbGw9IiNCRkI2MjAiLz4KPGNpcmNsZSBjeD0iMTA2NCIgY3k9IjU2OCIgcj0iNSIgZmlsbD0iI0JGQjYyMCIvPgoKPCEtLSBUcmlhbmd1bG8gYWxlcnRhIGFycmliYSBjZW50cm8gLS0+Cjxwb2x5Z29uIHBvaW50cz0iOTYwLDEwMCA5MjQsMTY0IDk5NiwxNjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0ZGNzUxRiIgc3Ryb2tlLXdpZHRoPSIyLjIiIG9wYWNpdHk9IjAuNjUiLz4KPGxpbmUgeDE9Ijk2MCIgeTE9IjExOCIgeDI9Ijk2MCIgeTI9IjE0NiIgc3Ryb2tlPSIjRkY3NTFGIiBzdHJva2Utd2lkdGg9IjIuMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBvcGFjaXR5PSIwLjY1Ii8+CjxjaXJjbGUgY3g9Ijk2MCIgY3k9IjE1NyIgcj0iMyIgZmlsbD0iI0ZGNzUxRiIgb3BhY2l0eT0iMC42NSIvPgoKPCEtLSBFc2N1ZG8gYXJyaWJhIGRlcmVjaGEgLS0+Cjxwb2x5Z29uIHBvaW50cz0iMTYwMCwxMTAgMTU2OCwxMjYgMTU2OCwxNjYgMTYwMCwxODIgMTYzMiwxNjYgMTYzMiwxMjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0JGQjYyMCIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjU1Ii8+Cjxwb2x5bGluZSBwb2ludHM9IjE1ODQsMTQ4IDE1OTYsMTYwIDE2MTgsMTM2IiBmaWxsPSJub25lIiBzdHJva2U9IiNCRkI2MjAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIwLjU1Ii8+Cgo8IS0tIE5vZG8gcmVkIGl6cXVpZXJkYSAtLT4KPGNpcmNsZSBjeD0iMzIwIiBjeT0iNDUwIiByPSIxNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY3NTFGIiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuNSIvPgo8Y2lyY2xlIGN4PSIzMjAiIGN5PSI0NTAiIHI9IjUuNSIgZmlsbD0iI0ZGNzUxRiIgb3BhY2l0eT0iMC41Ii8+CjxsaW5lIHgxPSIzMzQiIHkxPSI0NTAiIHgyPSIzODAiIHkyPSI0NTAiIHN0cm9rZT0iI0ZGNzUxRiIgc3Ryb2tlLXdpZHRoPSIxLjIiIG9wYWNpdHk9IjAuNCIvPgo8Y2lyY2xlIGN4PSIzOTAiIGN5PSI0NTAiIHI9IjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0ZGNzUxRiIgc3Ryb2tlLXdpZHRoPSIxLjIiIG9wYWNpdHk9IjAuMzUiLz4KCjwhLS0gTm9kbyByZWQgZGVyZWNoYSAtLT4KPGNpcmNsZSBjeD0iMTYwMCIgY3k9IjQ1MCIgcj0iMTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0JGQjYyMCIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjUiLz4KPGNpcmNsZSBjeD0iMTYwMCIgY3k9IjQ1MCIgcj0iNS41IiBmaWxsPSIjQkZCNjIwIiBvcGFjaXR5PSIwLjUiLz4KPGxpbmUgeDE9IjE1NDAiIHkxPSI0NTAiIHgyPSIxNTg2IiB5Mj0iNDUwIiBzdHJva2U9IiNCRkI2MjAiIHN0cm9rZS13aWR0aD0iMS4yIiBvcGFjaXR5PSIwLjQiLz4KPGNpcmNsZSBjeD0iMTUzMCIgY3k9IjQ1MCIgcj0iNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQkZCNjIwIiBzdHJva2Utd2lkdGg9IjEuMiIgb3BhY2l0eT0iMC4zNSIvPgoKPCEtLSBMaW5lYXMgZGF0b3MgaXpxdWllcmRhIC0tPgo8bGluZSB4MT0iMjQwIiB5MT0iMzAwIiB4Mj0iNTYwIiB5Mj0iMzcwIiBzdHJva2U9IiNGRjc1MUYiIHN0cm9rZS13aWR0aD0iMS40IiBvcGFjaXR5PSIwLjQ1Ii8+CjxsaW5lIHgxPSIyMjQiIHkxPSIzMjQiIHgyPSI1NDQiIHkyPSIzOTQiIHN0cm9rZT0iI0ZGNzUxRiIgc3Ryb2tlLXdpZHRoPSIwLjkiIG9wYWNpdHk9IjAuMjgiLz4KPGxpbmUgeDE9IjIyOCIgeTE9IjM0OCIgeDI9IjU0OCIgeTI9IjQxOCIgc3Ryb2tlPSIjRkY3NTFGIiBzdHJva2Utd2lkdGg9IjAuNiIgb3BhY2l0eT0iMC4xOCIvPgoKPCEtLSBMaW5lYXMgZGF0b3MgZGVyZWNoYSAtLT4KPGxpbmUgeDE9IjE2ODAiIHkxPSIzMDAiIHgyPSIxMzYwIiB5Mj0iMzcwIiBzdHJva2U9IiNCRkI2MjAiIHN0cm9rZS13aWR0aD0iMS40IiBvcGFjaXR5PSIwLjQ1Ii8+CjxsaW5lIHgxPSIxNjk2IiB5MT0iMzI0IiB4Mj0iMTM3NiIgeTI9IjM5NCIgc3Ryb2tlPSIjQkZCNjIwIiBzdHJva2Utd2lkdGg9IjAuOSIgb3BhY2l0eT0iMC4yOCIvPgo8bGluZSB4MT0iMTY5MiIgeTE9IjM0OCIgeDI9IjEzNzIiIHkyPSI0MTgiIHN0cm9rZT0iI0JGQjYyMCIgc3Ryb2tlLXdpZHRoPSIwLjYiIG9wYWNpdHk9IjAuMTgiLz4KCjwhLS0gTGluZWFzIGRhdG9zIGFiYWpvIGl6cXVpZXJkYSAtLT4KPGxpbmUgeDE9IjI0MCIgeTE9IjYwMCIgeDI9IjU2MCIgeTI9IjUzMCIgc3Ryb2tlPSIjMTlDNEQ1IiBzdHJva2Utd2lkdGg9IjEuNCIgb3BhY2l0eT0iMC40NSIvPgo8bGluZSB4MT0iMjI0IiB5MT0iNjI0IiB4Mj0iNTQ0IiB5Mj0iNTU0IiBzdHJva2U9IiMxOUM0RDUiIHN0cm9rZS13aWR0aD0iMC45IiBvcGFjaXR5PSIwLjI4Ii8+Cgo8IS0tIExpbmVhcyBkYXRvcyBhYmFqbyBkZXJlY2hhIC0tPgo8bGluZSB4MT0iMTY4MCIgeTE9IjYwMCIgeDI9IjEzNjAiIHkyPSI1MzAiIHN0cm9rZT0iIzE5QzRENSIgc3Ryb2tlLXdpZHRoPSIxLjQiIG9wYWNpdHk9IjAuNDUiLz4KPGxpbmUgeDE9IjE2OTYiIHkxPSI2MjQiIHgyPSIxMzc2IiB5Mj0iNTU0IiBzdHJva2U9IiMxOUM0RDUiIHN0cm9rZS13aWR0aD0iMC45IiBvcGFjaXR5PSIwLjI4Ii8+Cgo8IS0tIE1hcmNvIGV4dGVyaW9yIC0tPgo8cmVjdCB4PSIyNCIgeT0iMjQiIHdpZHRoPSIxODcyIiBoZWlnaHQ9Ijg1MiIgcng9IjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE5QzRENSIgc3Ryb2tlLXdpZHRoPSIwLjYiIG9wYWNpdHk9IjAuMTUiLz4KCjwhLS0gTGluZWFzIHBpZSAtLT4KPGxpbmUgeDE9IjYwIiB5MT0iODU0IiB4Mj0iMTIwIiB5Mj0iODU0IiBzdHJva2U9IiNGRjc1MUYiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjciLz4KPGxpbmUgeDE9IjE4MDAiIHkxPSI4NTQiIHgyPSIxODYwIiB5Mj0iODU0IiBzdHJva2U9IiNCRkI2MjAiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjciLz4KPC9zdmc+" alt="Escape room portada" />';
  html += '<div class="orh-aud-intro-hero-text">';
  html += '<div class="orh-aud-intro-tag" style="color:#FF751F">Escape room</div>';
  html += '<h2 class="orh-aud-intro-titulo">\u00bfD\u00f3nde se rompi\u00f3 la cadena de la protecci\u00f3n de datos de RR. HH.?</h2>';
  html += '<p class="orh-aud-intro-sub">Una empleada denuncia ante la AEPD que informaci\u00f3n de su evaluaci\u00f3n del desempe\u00f1o ha llegado a un proveedor externo que nunca particip\u00f3 en el proceso. El Comit\u00e9 de Crisis se re\u00fane en 60 minutos y has de darles una explicaci\u00f3n.</p>';
  
  html += '</div>';
  html += '</div>';

  // Explicacion
  html += '<div class="orh-aud-intro-explicacion">';
  html += '<p>Esta simulaci\u00f3n te plantea una reconstrucci\u00f3n de un incidente real de gesti\u00f3n de datos en RR. HH: examinas documentos, lees declaraciones contradictorias, tomas decisiones bajo presi\u00f3n jer\u00e1rquica y, al final, presentas tu diagn\u00f3stico ante el Comit\u00e9.</p>';
  html += '<p>Lo que el sistema captura no es si aciertas, sino c\u00f3mo razonas: qu\u00e9 evidencias examinas primero, qu\u00e9 hip\u00f3tesis priorizas, c\u00f3mo respondes cuando el Director General empuja en sentido contrario. Al terminar recibes un informe con el diagn\u00f3stico del caso y un mapa de tu propio razonamiento.</p>';
  html += '<p class="orh-aud-aviso"><strong>Aviso:</strong> la mayor\u00eda llega al final habiendo investigado el problema equivocado. <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"vertical-align:-2px;margin-left:4px\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M8 13s1.5 2 4 2 4-2 4-2\"/><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\"/><path d=\"M15 9l1.5 1.5L18 9\"/></svg></p>';
  html += '<div class="orh-aud-intro-meta"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"vertical-align:-2px;margin-right:5px\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>Tiempo estimado: entre 15 y 25 minutos</div>';
  html += '</div>';

  // Hipotesis
  html += '<div class="orh-aud-intro-hip">';
  html += '<div class="orh-aud-intro-hip-titulo">Cuatro hip\u00f3tesis compiten desde el inicio</div>';
  var hips = [
    { color: '#19C4D5', label: 'H1', desc: 'Fallo tecnol\u00f3gico en el sistema de accesos' },
    { color: '#BFB620', label: 'H2', desc: 'Cultura organizativa permisiva' },
    { color: '#FF751F', label: 'H3', desc: 'Gobernanza deficiente de accesos y contratos' },
    { color: '#002445', label: 'H4', desc: 'Tratamiento il\u00edcito desde el origen' }
  ];
  for (var i = 0; i < hips.length; i++) {
    html += '<div class="orh-aud-intro-hip-item">';
    html += '<span class="orh-aud-intro-hip-badge" style="background:' + hips[i].color + '">' + hips[i].label + '</span>';
    html += '<span>' + hips[i].desc + '</span>';
    html += '</div>';
  }
  html += '</div>';

  html += '<button class="orh-aud-btn-primary" id="orh-aud-comenzar">Iniciar investigaci\u00f3n</button>';
  html += '</div>';
  c.innerHTML = html;
  document.getElementById('orh-aud-comenzar').addEventListener('click', function() {
    estado.expediente = 1;
    iniciarCronometro();
    render();
  });
}

// ============================================================
// EXPEDIENTE 1
// ============================================================

function renderExp1(c) {
  var html = htmlHeader('Expediente 1', 'Mapa del proceso');
  html += htmlBarras();
  html += htmlProgreso(1);
  html += '<p class="orh-aud-instruccion">Antes de buscar al culpable, entiende el proceso. Examina las evidencias disponibles.</p>';

  html += '<div class="orh-aud-flujo">';
  var pasos = ['Evaluaci\u00f3n individual','Calibraci\u00f3n entre managers','Comit\u00e9 de talento','Plan de desarrollo individual','Proveedor de formaci\u00f3n externa'];
  for (var i = 0; i < pasos.length; i++) {
    html += '<div class="orh-aud-flujo-paso">' + pasos[i] + '</div>';
    if (i < pasos.length - 1) html += '<div class="orh-aud-flujo-arrow">&#8595;</div>';
  }
  html += '</div>';

  html += htmlEvidencia('E1A', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/></svg>', 'Pol\u00edtica de accesos al sistema',
    '<p>Todos los miembros del Comit\u00e9 de Talento tienen acceso completo a todos los expedientes de evaluaci\u00f3n, con independencia del \u00e1rea funcional. El acceso no est\u00e1 limitado por departamento, nivel jer\u00e1rquico ni necesidad funcional declarada.</p><p><em>\u00daltima revisi\u00f3n de la pol\u00edtica: hace 3 a\u00f1os.</em></p>');
  html += htmlEvidencia('E1B', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/></svg>', 'Contrato con el proveedor de formaci\u00f3n',
    '<p>Contrato de prestaci\u00f3n de servicios formativos. Firmado hace 2 a\u00f1os.</p><p>Objeto: dise\u00f1o e impartici\u00f3n de programa de liderazgo.</p><p><strong>Cl\u00e1usula de protecci\u00f3n de datos: no figura.<br>Cl\u00e1usula de encargado del tratamiento: no figura.</strong></p><p><em>Renovaci\u00f3n autom\u00e1tica anual. \u00daltima revisi\u00f3n jur\u00eddica: fecha de firma.</em></p>');
  html += htmlEvidencia('E1C', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>', 'Declaraci\u00f3n del HRBP',
    '<blockquote class="orh-aud-quote">Llevamos a\u00f1os trabajando con esta consultora. Siempre les hemos dado acceso a la informaci\u00f3n que necesitan. El contrato lo gestion\u00f3 Jur\u00eddico cuando empezamos la relaci\u00f3n.</blockquote>');
  html += htmlEvidencia('E1D', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/></svg>', 'Declaraci\u00f3n del Director General',
    '<blockquote class="orh-aud-quote">Esta consultora lleva tres a\u00f1os con nosotros. Son de confianza. Si empezamos a limitar la informaci\u00f3n que les damos, el programa pierde calidad. No podemos permitirnos perder dos semanas anonimizando datos cuando tenemos el programa en marcha.</blockquote>');

  html += '<div class="orh-aud-pregunta-bloque" id="bloque-preg-1">';
  html += '<p class="orh-aud-pregunta">\u00bfEn qu\u00e9 punto del proceso dejan de existir una base jur\u00eddica leg\u00edtima y una necesidad funcional para seguir compartiendo los datos?</p>';
  var opts1 = [
    'En la calibraci\u00f3n entre managers',
    'En el comit\u00e9 de talento',
    'Al llegar al proveedor de formaci\u00f3n',
    'El problema no est\u00e1 en una fase concreta, sino en qu\u00e9 datos se recogieron desde el principio'
  ];
  html += htmlOpciones(opts1, 'D1', null);
  html += '</div>';
  html += '<div id="feedback-1" style="display:none"></div>';

  c.innerHTML = html;
  bindEvidencias(['E1A','E1B','E1C','E1D']);
  bindOpciones('D1', function(val) {
    registrarDecision('D1_tipo', val === 3 ? 'sistemico' : (val === 2 ? 'externo' : 'interno'));
    if (val === 3) aplicarEvidencia('E1A'); // bonus H4
    var fb = document.getElementById('feedback-1');
    fb.className = 'orh-aud-feedback';
    fb.innerHTML = '<p>Tu posici\u00f3n ha quedado registrada. La investigaci\u00f3n contin\u00faa.</p>';
    fb.style.display = 'block';
    var btn = btnSiguiente('Pasar al expediente 2 &#8594;', function() {
      estado.expediente = 2;
      render();
    });
    fb.appendChild(btn);
  }, false);
}

// ============================================================
// EXPEDIENTE 2
// ============================================================

function renderExp2(c) {
  var html = htmlHeader('Expediente 2', 'Permisos y accesos');
  html += htmlBarras();
  html += htmlProgreso(2);
  html += '<p class="orh-aud-instruccion">El HRBP recibe cuatro solicitudes de acceso simult\u00e1neas. Cada una tiene una justificaci\u00f3n. \u00c9l te consulta antes de decidir.</p>';

  var solicitudes = [
    {
      rol: 'Director de \u00e1rea B',
      peticion: 'Acceso a las evaluaciones completas de empleados fuera de su departamento.',
      justificacion: 'Participa en el Comit\u00e9 de Talento transversal y necesita contexto completo para comparar perfiles.'
    },
    {
      rol: 'Consultora de formaci\u00f3n',
      peticion: 'Acceso a los comentarios cualitativos de los managers para personalizar el programa de liderazgo.',
      justificacion: 'Sin comentarios individuales el programa pierde calidad y se convierte en algo gen\u00e9rico.'
    },
    {
      rol: 'Proveedor tecnol\u00f3gico (plataforma LMS)',
      peticion: 'Acceso al feedback cualitativo para configurar los itinerarios de aprendizaje.',
      justificacion: 'Necesitan entender el perfil competencial de cada participante para personalizar la experiencia.'
    },
    {
      rol: 'Responsable de Compensaci\u00f3n',
      peticion: 'Acceso a las valoraciones de potencial de toda la plantilla.',
      justificacion: 'Est\u00e1 dise\u00f1ando la nueva pol\u00edtica de retribuci\u00f3n variable ligada al potencial.'
    }
  ];

  html += '<div class="orh-aud-solicitudes">';
  for (var i = 0; i < solicitudes.length; i++) {
    html += '<div class="orh-aud-solicitud">';
    html += '<div class="orh-aud-sol-rol">' + solicitudes[i].rol + '</div>';
    html += '<div class="orh-aud-sol-peticion">' + solicitudes[i].peticion + '</div>';
    html += '<div class="orh-aud-sol-just"><em>Justificaci\u00f3n: ' + solicitudes[i].justificacion + '</em></div>';
    html += '</div>';
  }
  html += '</div>';

  html += '<div class="orh-aud-pregunta-bloque">';
  html += '<p class="orh-aud-pregunta">\u00bfQu\u00e9 acceso autorizas primero, antes de analizar los dem\u00e1s?</p>';
  var opts2a = [
    'Director de \u00e1rea B \u2014 tiene justificaci\u00f3n funcional para el comit\u00e9 transversal',
    'Consultora de formaci\u00f3n \u2014 la calidad del programa depende de esa informaci\u00f3n',
    'Proveedor tecnol\u00f3gico \u2014 necesita datos para configurar la plataforma',
    'Responsable de Compensaci\u00f3n \u2014 la pol\u00edtica retributiva lo requiere'
  ];
  html += htmlOpciones(opts2a, 'D2A', null);
  html += '</div>';
  html += '<div id="feedback-2a" style="display:none"></div>';

  html += '<div id="bloque-2b" style="display:none">';
  html += '<div class="orh-aud-pregunta-bloque">';
  html += '<p class="orh-aud-pregunta">El Director General interviene: <em>\u201cLa consultora necesita toda la informaci\u00f3n. Si les limitamos el acceso, el programa pierde calidad.\u201d</em><br>\u00bfC\u00f3mo respondes?</p>';
  var opts2b = [
    'Acepto. La calidad del programa depende de la informaci\u00f3n disponible',
    'Propongo compartir competencias agregadas por colectivo, sin datos individuales',
    'Propongo que la consultora dise\u00f1e entrevistas individuales voluntarias con los participantes',
    'No autorizo nada hasta verificar si el proveedor est\u00e1 homologado en el registro aprobado por el DPO'
  ];
  html += htmlOpciones(opts2b, 'D2B', null);
  html += '</div>';
  html += '<div id="feedback-2b" style="display:none"></div>';
  html += '</div>';

  c.innerHTML = html;

  bindOpciones('D2A', function(val) {
    registrarDecision('D2A_prioridad', val);
    var fb = document.getElementById('feedback-2a');
    fb.className = 'orh-aud-feedback';
    fb.innerHTML = '<p>Decisi\u00f3n registrada. Ahora el Director General interviene.</p>';
    fb.style.display = 'block';
    document.getElementById('bloque-2b').style.display = 'block';
    bindOpciones('D2B', function(val2) {
      registrarDecision('D2B_presion', val2 === 0 ? 'cede' : (val2 === 3 ? 'proceso' : 'alternativa'));
      registrarTiempo('D2B');
      var fb2 = document.getElementById('feedback-2b');
      fb2.className = 'orh-aud-feedback';
      fb2.innerHTML = '<p>Tu posici\u00f3n ante la presi\u00f3n jer\u00e1rquica ha quedado registrada.</p>';
      fb2.style.display = 'block';
      var btn = btnSiguiente('Pasar al expediente 3 &#8594;', function() {
        estado.expediente = 3;
        render();
      });
      fb2.appendChild(btn);
    }, true);
  }, false);
}

// ============================================================
// EXPEDIENTE 3
// ============================================================

function renderExp3(c) {
  var html = htmlHeader('Expediente 3', 'Comunicaciones');
  html += htmlBarras();
  html += htmlProgreso(3);
  html += '<p class="orh-aud-instruccion">Los sistemas registran accesos. Las personas toman decisiones. Aqu\u00ed est\u00e1 la decisi\u00f3n.</p>';

  html += '<div class="orh-aud-correo">';
  html += '<div class="orh-aud-correo-header">Hilo de correo electr\u00f3nico</div>';

  var mensajes = [
    { de: 'HRBP', para: 'Consultora de formaci\u00f3n', asunto: 'Materiales para el programa de liderazgo', cuerpo: 'Hola Laura,\n\nOs env\u00edo las evaluaciones del \u00faltimo ciclo para que pod\u00e1is preparar el programa. Est\u00e1n todas, por si necesit\u00e1is contexto. Ya sab\u00e9is que cuanta m\u00e1s informaci\u00f3n ten\u00e9is, mejor pod\u00e9is trabajar.' },
    { de: 'Consultora', para: 'HRBP', asunto: 'RE: Materiales para el programa de liderazgo', cuerpo: 'Perfecto, muchas gracias. \u00bfPod\u00e9is incluir tambi\u00e9n los comentarios cualitativos de los managers? Nos ayuda mucho a personalizar los m\u00f3dulos.' },
    { de: 'HRBP', para: 'Consultora', asunto: 'RE: Materiales para el programa de liderazgo', cuerpo: 'Claro, os lo mando ahora. Si necesit\u00e1is algo m\u00e1s, me dec\u00eds.' }
  ];

  for (var i = 0; i < mensajes.length; i++) {
    var m = mensajes[i];
    html += '<div class="orh-aud-mensaje">';
    html += '<div class="orh-aud-msg-meta"><strong>De:</strong> ' + m.de + ' &nbsp;<strong>Para:</strong> ' + m.para + '</div>';
    html += '<div class="orh-aud-msg-asunto"><strong>Asunto:</strong> ' + m.asunto + '</div>';
    html += '<div class="orh-aud-msg-cuerpo">' + m.cuerpo.replace(/\n/g, '<br>') + '</div>';
    html += '</div>';
  }
  html += '</div>';

  // Evidencias adicionales - OneNote aparece aqui (llega "tarde")
  html += '<p class="orh-aud-instruccion" style="margin-top:20px">Mientras revisas el hilo, llegan nuevas evidencias.</p>';

  html += htmlEvidencia('E3A', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>', 'Declaraci\u00f3n del HRBP',
    '<blockquote class="orh-aud-quote">Yo nunca env\u00ed datos m\u00e9dicos. Lo que envi\u00e9 fueron evaluaciones de desempe\u00f1o y comentarios profesionales. Eso es informaci\u00f3n de trabajo, no informaci\u00f3n personal sensible.</blockquote>');
  html += htmlEvidencia('E3B', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"/><rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\"/></svg>', 'Posici\u00f3n de Recursos Jur\u00eddicos',
    '<blockquote class="orh-aud-quote">Los comentarios sobre desempe\u00f1o profesional no constituyen datos de categor\u00eda especial seg\u00fan el art\u00edculo 9 del RGPD. Un comentario del manager sobre el rendimiento de un empleado es informaci\u00f3n laboral, no informaci\u00f3n m\u00e9dica o personal sensible.</blockquote>');
  html += htmlEvidencia('E3C', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>', 'Posici\u00f3n del DPO',
    '<blockquote class="orh-aud-quote">Discrepo. El problema no es si los comentarios son o no categor\u00eda especial. El problema es que entre esos comentarios hay referencias expl\u00edcitas a situaciones personales, de salud y familiares de empleadas concretas. Eso cambia completamente la categorizaci\u00f3n del tratamiento. Adem\u00e1s, no existe contrato de encargado del tratamiento con esta consultora. El env\u00edo no ten\u00eda cobertura jur\u00eddica independientemente del tipo de dato.</blockquote>');

  // ONENOTE - aparece como alerta destacada
  html += '<div class="orh-aud-alerta-evidencia">';
  html += '<div class="orh-aud-alerta-ev-titulo"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"vertical-align:-2px\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg> Nueva evidencia localizada</div>';
  html += '<p>Mientras revisas el correo, IT localiza un OneNote compartido del HRBP con el Comit\u00e9 de Talento.</p>';
  html += htmlEvidencia('E3C_onenote', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"/><path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"/></svg>', 'OneNote \u2014 Notas del comit\u00e9 de talento',
    '<div class="orh-aud-onenote">' +
    '<p><strong>Laura M.</strong> \u2014 Potencial alto. <span class="orh-aud-dato-sensible">Pendiente: baja maternidad prevista Q2.</span> Revisar en siguiente ciclo.</p>' +
    '<p><strong>Marcos R.</strong> \u2014 Rendimiento s\u00f3lido. <span class="orh-aud-dato-sensible">Situaci\u00f3n de salud activa. M\u00e9dico recomienda carga reducida.</span> No apto programa aceleraci\u00f3n.</p>' +
    '<p><strong>Ana T.</strong> \u2014 Perfil v\u00e1lido. <span class="orh-aud-dato-sensible">Reducci\u00f3n jornada solicitada por motivos familiares.</span> Disponibilidad limitada.</p>' +
    '</div>');
  html += '</div>';

  html += '<div class="orh-aud-pregunta-bloque">';
  html += '<p class="orh-aud-pregunta">Jur\u00eddico y el DPO discrepan. El Comit\u00e9 de Crisis te pide que tomes posici\u00f3n. \u00bfCon qui\u00e9n coincides?</p>';
  var opts3 = [
    'Con Jur\u00eddico. Son comentarios profesionales, no datos m\u00e9dicos',
    'Con el DPO. El contenido concreto de los comentarios determina la categor\u00eda, no el soporte',
    'El debate sobre la categor\u00eda es secundario. El problema principal es la ausencia de contrato de encargado',
    'Ambos tienen raz\u00f3n en parte. La ausencia de contrato es la infracci\u00f3n formal; el contenido es la infracci\u00f3n material'
  ];
  html += htmlOpciones(opts3, 'D3', null);
  html += '</div>';
  html += '<div id="feedback-3" style="display:none"></div>';

  c.innerHTML = html;
  bindEvidencias(['E3A','E3B','E3C','E3C_onenote']);
  // Aplicar peso del OneNote cuando se abra
  var evON = document.getElementById('ev-E3C_onenote');
  if (evON) {
    evON.addEventListener('click', function() {
      aplicarEvidencia('E4A'); // mismo peso que evidencia 4A
    });
  }

  bindOpciones('D3', function(val) {
    iniciarTiempo('D3');
    registrarTiempo('D3');
    var tipos = ['juridico','dpo','contrato','integral'];
    registrarDecision('D3_tipo', tipos[val]);
    if (val === 1 || val === 3) aplicarEvidencia('E3C');
    var fb = document.getElementById('feedback-3');
    fb.className = 'orh-aud-feedback';
    fb.innerHTML = '<p>Tu posici\u00f3n ha quedado registrada. Esta es la decisi\u00f3n con mayor peso en tu perfil de auditor.</p>';
    fb.style.display = 'block';
    var btn = btnSiguiente('Pasar al expediente 4 &#8594;', function() {
      estado.expediente = 4;
      render();
    });
    fb.appendChild(btn);
  }, true);
}

// ============================================================
// EXPEDIENTE 4
// ============================================================

function renderExp4(c) {
  var html = htmlHeader('Expediente 4', 'El comit\u00e9 de talento');
  html += htmlBarras();
  html += htmlProgreso(4);
  html += '<p class="orh-aud-instruccion">El sistema registr\u00f3 los accesos. El correo registr\u00f3 el env\u00edo. Esto registr\u00f3 lo que nadie quer\u00eda que quedara registrado.</p>';

  html += '<div class="orh-aud-teams">';
  html += '<div class="orh-aud-teams-header"><span class="orh-aud-teams-icon"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg></span> Microsoft Teams \u2014 Canal: Comit\u00e9 de Talento Q4</div>';
  var msgs = [
    { autor: 'Director \u00e1rea A', hora: '10:23', texto: 'Laura tiene potencial pero ya sab\u00e9is la situaci\u00f3n. Con la baja que viene va a ser complicado meterla en el programa este a\u00f1o.' },
    { autor: 'HRBP', hora: '10:25', texto: 'Entiendo. Lo anotamos para el a\u00f1o que viene.' },
    { autor: 'Director \u00e1rea B', hora: '10:31', texto: 'Marcos es el mejor del grupo pero lleva meses con lo suyo. El m\u00e9dico le ha recomendado reducir carga. No s\u00e9 si es el momento.' },
    { autor: 'HRBP', hora: '10:33', texto: 'Ok. Lo dejamos en observaci\u00f3n.' },
    { autor: 'Director \u00e1rea A', hora: '10:38', texto: 'Ana ha pedido reducci\u00f3n de jornada. Tiene problemas en casa. Buen perfil pero ahora mismo no puede asumir m\u00e1s.' },
    { autor: 'HRBP', hora: '10:41', texto: 'Anotado.' }
  ];
  for (var i = 0; i < msgs.length; i++) {
    html += '<div class="orh-aud-teams-msg">';
    html += '<div class="orh-aud-teams-autor">' + msgs[i].autor + ' <span class="orh-aud-teams-hora">' + msgs[i].hora + '</span></div>';
    html += '<div class="orh-aud-teams-texto">' + msgs[i].texto + '</div>';
    html += '</div>';
  }
  html += '</div>';

  html += htmlEvidencia('E4A', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/></svg>', 'OneNote \u2014 ya examinado en expediente 3', '<p>Este documento ya qued\u00f3 registrado en tu investigaci\u00f3n anterior.</p>');
  html += htmlEvidencia('E4B', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>', 'Declaraci\u00f3n del director de \u00e1rea',
    '<blockquote class="orh-aud-quote">Eso son conversaciones informales de gesti\u00f3n. No es un documento oficial. Todos los managers hablamos as\u00ed cuando evaluamos al equipo. Es contexto, no un expediente.</blockquote>');

  html += '<div class="orh-aud-pregunta-bloque">';
  html += '<p class="orh-aud-pregunta">\u00bfQu\u00e9 problema identifica este expediente?</p>';
  var opts4a = [
    'Se usaron canales informales para documentar decisiones de talento',
    'Se incorporaron datos que no deb\u00edan estar en el expediente de talento sin base jur\u00eddica ni necesidad funcional',
    'Los sesgos sobre maternidad, salud y situaci\u00f3n familiar contaminaron las decisiones de talento',
    'Los tres problemas coexisten y se retroalimentan: el canal informal facilit\u00f3 registrar datos que nunca deb\u00ederon recogerse, y esos datos introdujeron sesgos en decisiones que afectaron a personas concretas'
  ];
  html += htmlOpciones(opts4a, 'D4A', null);
  html += '</div>';
  html += '<div id="feedback-4a" style="display:none"></div>';

  html += '<div id="bloque-4b" style="display:none">';
  html += '<div class="orh-aud-pregunta-bloque">';
  html += '<p class="orh-aud-pregunta">El director de \u00e1rea argumenta que son \u201cconversaciones informales de gesti\u00f3n, no un expediente oficial\u201d. \u00bfQu\u00e9 respondes?</p>';
  var opts4b = [
    'Tiene raz\u00f3n. Son notas de trabajo internas, no documentos formales',
    'El soporte no determina la naturaleza del dato. Si est\u00e1 registrado y afecta a decisiones sobre personas, es un tratamiento de datos con independencia del canal',
    'El problema no es el canal sino el contenido. Registrar una baja de maternidad como factor de evaluaci\u00f3n del potencial puede constituir discriminaci\u00f3n',
    'Las dos respuestas anteriores son correctas y complementarias'
  ];
  html += htmlOpciones(opts4b, 'D4B', null);
  html += '</div>';
  html += '<div id="feedback-4b" style="display:none"></div>';
  html += '</div>';

  c.innerHTML = html;
  bindEvidencias(['E4A','E4B']);

  bindOpciones('D4A', function(val) {
    var tipos = ['canal','datos','sesgo','sistemico'];
    registrarDecision('D4A_tipo', tipos[val]);
    if (val === 1 || val === 3) aplicarEvidencia('E4A');
    var fb = document.getElementById('feedback-4a');
    fb.className = 'orh-aud-feedback';
    fb.innerHTML = '<p>Registrado. Ahora el director de \u00e1rea contraargumenta.</p>';
    fb.style.display = 'block';
    document.getElementById('bloque-4b').style.display = 'block';
    bindOpciones('D4B', function(val2) {
      var tipos2 = ['acepta','soporte','discriminacion','integral'];
      registrarDecision('D4B_tipo', tipos2[val2]);
      if (val2 === 0) aplicarEvidencia('E4B');
      var fb2 = document.getElementById('feedback-4b');
      fb2.className = 'orh-aud-feedback';
      fb2.innerHTML = '<p>Tu posici\u00f3n ha quedado registrada. Pasas al expediente final.</p>';
      fb2.style.display = 'block';
      var btn = btnSiguiente('Pasar al expediente 5 &#8594;', function() {
        estado.expediente = 5;
        render();
      });
      fb2.appendChild(btn);
    }, false);
  }, false);
}

// ============================================================
// EXPEDIENTE 5
// ============================================================

function renderExp5(c) {
  detenerCronometro();
  var seg = tiempoUsado();
  var mins = Math.floor(seg / 60);
  var secs = seg % 60;
  var tiempoStr = mins + ':' + (secs < 10 ? '0' : '') + secs;

  var html = htmlHeader('Expediente 5', 'Comparecencia ante el Comit\u00e9 de Crisis');
  html += htmlBarras();
  html += htmlProgreso(5);
  html += '<p class="orh-aud-instruccion">Han pasado ' + tiempoStr + '. El Comit\u00e9 espera tu informe. El inspector de la AEPD se ha incorporado a la reuni\u00f3n.</p>';

  html += '<div class="orh-aud-inspector">';
  html += '<div class="orh-aud-inspector-label">Inspector de la AEPD \u2014 Primera intervenci\u00f3n</div>';
  html += '<blockquote class="orh-aud-quote">\u201cEl env\u00edo de datos a un proveedor sin contrato de encargado del tratamiento constituye por s\u00ed mismo una infracci\u00f3n del art\u00edculo 28 del RGPD. \u00bfPuede explicarme por qu\u00e9 la empresa no verific\u00f3 este extremo antes de iniciar la relaci\u00f3n con la consultora?\u201d</blockquote>';
  html += '</div>';

  html += '<div class="orh-aud-pregunta-bloque">';
  html += '<p class="orh-aud-pregunta">\u00bfQu\u00e9 trasladar\u00edas al Comit\u00e9?</p>';
  var opts5a = [
    'Fue un error del HRBP que no sigui\u00f3 el procedimiento establecido',
    'No exist\u00eda un procedimiento establecido para verificar la homologaci\u00f3n de proveedores que reciben datos personales',
    'La empresa contaba con que Jur\u00eddico hab\u00eda revisado el contrato en el momento de la firma',
    'La ausencia de contrato refleja una pr\u00e1ctica habitual que no se hab\u00eda cuestionado: un fallo de gobernanza, no un error puntual'
  ];
  html += htmlOpciones(opts5a, 'D5A', null);
  html += '</div>';
  html += '<div id="feedback-5a" style="display:none"></div>';

  html += '<div id="bloque-5b" style="display:none">';
  html += '<div class="orh-aud-inspector">';
  html += '<div class="orh-aud-inspector-label">Inspector de la AEPD \u2014 Segunda intervenci\u00f3n</div>';
  html += '<blockquote class="orh-aud-quote">\u201cEntre los datos enviados a la consultora figuran referencias a bajas de maternidad, situaciones de salud y circunstancias familiares de empleadas concretas.\u201d</blockquote>';
  html += '<div class="orh-aud-silencio">';
  html += '<p class="orh-aud-silencio-texto">\u00bfPuede decirme qu\u00e9 obligaci\u00f3n legal justificaba registrar esa informaci\u00f3n en un expediente de talento?</p>';
  html += '<button class="orh-aud-btn-silencio" id="btn-silencio">No hay respuesta posible. Continuar</button>';
  html += '</div>';
  html += '</div>';
  html += '</div>';

  html += '<div id="bloque-5c" style="display:none">';
  html += '<div class="orh-aud-inspector">';
  html += '<div class="orh-aud-inspector-label">Inspector de la AEPD \u2014 Tercera intervenci\u00f3n</div>';
  html += '<blockquote class="orh-aud-quote">\u201cEl env\u00edo sin contrato encendi\u00f3 la mecha. Pero fueron los datos registrados ileg\u00edtimamente en el expediente de talento \u2014datos que afectan a la salud, la maternidad y la situaci\u00f3n personal\u2014 los que convirtieron este incidente en una infracci\u00f3n de m\u00e1xima categor\u00eda. Estamos ante dos infracciones independientes, no ante una sola.\u201d</blockquote>';
  html += '</div>';
  html += '<div class="orh-aud-pregunta-bloque">';
  html += '<p class="orh-aud-pregunta">Selecciona las tres causas ra\u00edz que presentar\u00edas al Comit\u00e9:</p>';
  var causas = [
    'Ausencia de contrato de encargado del tratamiento con el proveedor',
    'El HRBP comparti\u00f3 m\u00e1s datos de los necesarios sin verificar la base jur\u00eddica',
    'Los accesos en el sistema no estaban limitados por el principio de m\u00ednimo privilegio',
    'La consultora solicit\u00f3 datos a los que no ten\u00eda derecho',
    'El proceso no ten\u00eda definida la finalidad espec\u00edfica de cada dato en cada fase',
    'El comit\u00e9 de talento incorpor\u00f3 datos sin base jur\u00eddica ni necesidad funcional verificada',
    'La organizaci\u00f3n acumul\u00f3 datos que nunca debieron recogerse',
    'No se realiz\u00f3 evaluaci\u00f3n de impacto antes de implantar el sistema de evaluaci\u00f3n'
  ];
  html += '<div class="orh-aud-causas" id="causas-wrap">';
  for (var i = 0; i < causas.length; i++) {
    html += '<div class="orh-aud-causa" data-idx="' + i + '" id="causa-' + i + '">' + causas[i] + '</div>';
  }
  html += '</div>';
  html += '<div id="causas-feedback" style="display:none"></div>';
  html += '<button class="orh-aud-btn-primary" id="btn-causas" style="display:none">Entregar informe al Comit\u00e9</button>';
  html += '</div>';
  html += '</div>';

  c.innerHTML = html;

  bindOpciones('D5A', function(val) {
    var tipos = ['individual','sistemico','juridico','gobernanza'];
    registrarDecision('D5A_tipo', tipos[val]);
    document.getElementById('feedback-5a').style.display = 'block';
    document.getElementById('feedback-5a').innerHTML = '<p>Registrado.</p>';
    document.getElementById('bloque-5b').style.display = 'block';

    document.getElementById('btn-silencio').addEventListener('click', function() {
      document.getElementById('bloque-5c').style.display = 'block';
      this.disabled = true;
      this.textContent = '\u2014';

      // Bind causas
      var seleccionadas = [];
      var causasEls = document.querySelectorAll('.orh-aud-causa');
      var btnCausas = document.getElementById('btn-causas');

      for (var j = 0; j < causasEls.length; j++) {
        causasEls[j].addEventListener('click', function() {
          var idx = parseInt(this.getAttribute('data-idx'));
          var pos = seleccionadas.indexOf(idx);
          if (pos !== -1) {
            seleccionadas.splice(pos, 1);
            this.classList.remove('orh-aud-causa-sel');
          } else if (seleccionadas.length < 3) {
            seleccionadas.push(idx);
            this.classList.add('orh-aud-causa-sel');
          }
          btnCausas.style.display = seleccionadas.length === 3 ? 'block' : 'none';
        });
      }

      btnCausas.addEventListener('click', function() {
        registrarDecision('D5_causas', seleccionadas.slice());
        var tiene6 = seleccionadas.indexOf(5) !== -1;
        var tiene7 = seleccionadas.indexOf(6) !== -1;
        var tiene1 = seleccionadas.indexOf(0) !== -1;
        var optima = tiene1 && tiene6 && tiene7;
        registrarDecision('D5_optima', optima);
        estado.expediente = 6;
        render();
      });
    });
  }, false);
}

// ============================================================
// RESULTADO FINAL
// ============================================================

function renderResultado(c) {
  var d = estado.decisiones;
  var optima = d['D5_optima'];

  // --- PANTALLA DE RESOLUCIÓN ---
  var html = '<div class="orh-aud-resultado">';

  if (optima) {
    html += '<div class="orh-aud-res-badge orh-aud-res-ok">Diagn\u00f3stico estructural</div>';
    html += '<div class="orh-aud-res-outcome">';
    html += '<p>El Comit\u00e9 toma nota. El plan de remediaci\u00f3n que se aprueba esa tarde no empieza por el contrato con la consultora. Empieza por una auditor\u00eda de qu\u00e9 datos existen, por qu\u00e9 existen y qui\u00e9n decidi\u00f3 recogerlos.</p>';
    html += '</div>';
  } else {
    html += '<div class="orh-aud-res-badge orh-aud-res-parcial">Diagn\u00f3stico parcial</div>';
    html += '<div class="orh-aud-res-outcome orh-aud-res-outcome-parcial">';
    html += '<p>El Comit\u00e9 aprueba el informe. Se rescinde la relaci\u00f3n con la consultora y se firma un nuevo contrato con encargado del tratamiento. Todos respiran aliviados...</p>';
    html += '<p>Tres semanas despu\u00e9s, el DPO detecta que las notas del OneNote siguen activas. Nadie las hab\u00eda mirado.</p>';
    html += '</div>';
  }

  // --- DIAGNÓSTICO ---
  html += '<div class="orh-aud-diagnostico">';
  html += '<h3 class="orh-aud-diag-titulo">Diagn\u00f3stico del caso</h3>';
  html += '<p>La filtraci\u00f3n se produjo porque exist\u00edan datos que compartir. La pregunta no era solo con qui\u00e9n se compartieron, sino por qu\u00e9 estaban ah\u00ed.</p>';
  html += '<p>El origen del incidente no fue el correo del HRBP. Fue la decisi\u00f3n \u2014tomada en un hilo de Teams, confirmada en un OneNote compartido\u2014 de incorporar al expediente de talento informaci\u00f3n sobre situaciones personales, de salud y familiares. Esos datos no deb\u00edan estar ah\u00ed.</p>';
  html += '<div class="orh-aud-diag-infracciones">';
  html += '<div class="orh-aud-infraccion orh-aud-inf-h3"><strong>Infracci\u00f3n formal (Art. 28 RGPD)</strong><p>Ausencia de contrato de encargado del tratamiento con el proveedor. Sancionable por s\u00ed misma con independencia del tipo de datos compartidos.</p></div>';
  html += '<div class="orh-aud-infraccion orh-aud-inf-h4"><strong>Infracci\u00f3n material (Arts. 5 y 9 RGPD)</strong><p>Recogida de datos sin base jur\u00eddica ni necesidad funcional verificada. Algunos de los datos registrados pueden pertenecer a categor\u00edas especiales seg\u00fan su contenido concreto. Todos violan el principio de minimizaci\u00f3n.</p></div>';
  html += '</div>';
  html += '<div class="orh-aud-pregunta-final">';
  html += '<p><em>Si ma\u00f1ana elimin\u00e1ramos el correo del HRBP, \u00bfel problema desaparecer\u00eda?</em></p>';
  html += '<div id="wrap-pregunta-final">';
  html += '<button class="orh-aud-btn-final" id="btn-si">S\u00ed</button>';
  html += '<button class="orh-aud-btn-final orh-aud-btn-no" id="btn-no">No</button>';
  html += '</div>';
  html += '<div id="respuesta-final" style="display:none"></div>';
  html += '</div>';
  html += '</div>';

  // --- PERFIL ---
  html += '<div id="bloque-perfil" style="display:none">';
  html += generarPerfil();
  html += '<button class="orh-aud-btn-secondary" id="btn-reiniciar">Volver a intentarlo</button>';
  html += '</div>';

  html += '</div>';
  c.innerHTML = html;

  document.getElementById('btn-si').addEventListener('click', function() {
    document.getElementById('wrap-pregunta-final').style.display = 'none';
    var rf = document.getElementById('respuesta-final');
    rf.innerHTML = '<p class="orh-aud-respuesta-final-ko">El correo fue el \u00faltimo paso. No el primero.</p>';
    rf.style.display = 'block';
    setTimeout(function() { document.getElementById('bloque-perfil').style.display = 'block'; }, 800);
  });

  document.getElementById('btn-no').addEventListener('click', function() {
    document.getElementById('wrap-pregunta-final').style.display = 'none';
    var rf = document.getElementById('respuesta-final');
    rf.innerHTML = '<p class="orh-aud-respuesta-final-ok">Correcto. El correo materializ\u00f3 el riesgo. No lo cre\u00f3.</p>';
    rf.style.display = 'block';
    setTimeout(function() { document.getElementById('bloque-perfil').style.display = 'block'; }, 800);
  });

  document.getElementById('btn-reiniciar').addEventListener('click', function() {
    estado.expediente = 0;
    estado.segundosRestantes = 3600;
    estado.hipotesis = { H1: 25, H2: 25, H3: 25, H4: 25 };
    estado.decisiones = {};
    estado.tiempos = {};
    estado.evidenciasExaminadas = [];
    estado.ts = {};
    if (estado.intervalo) clearInterval(estado.intervalo);
    render();
  });
}

function generarPerfil() {
  var d = estado.decisiones;
  var ev = estado.evidenciasExaminadas;

  // Calcular dimensiones
  var dims = {
    tecnologia: 0,
    proceso: 0,
    gobernanza: 0,
    minimizacion: 0,
    sesgos: 0
  };

  if (ev.indexOf('E1A') !== -1) dims.tecnologia += 30;
  if (ev.indexOf('E1B') !== -1) dims.gobernanza += 30;
  if (ev.indexOf('E1C') !== -1) dims.proceso += 20;
  if (ev.indexOf('E1D') !== -1) dims.proceso += 20;
  if (ev.indexOf('E3A') !== -1) dims.proceso += 20;
  if (ev.indexOf('E3B') !== -1) dims.gobernanza += 20;
  if (ev.indexOf('E3C') !== -1) dims.gobernanza += 30;
  if (ev.indexOf('E3C_onenote') !== -1) { dims.minimizacion += 40; dims.sesgos += 30; }
  if (ev.indexOf('E4A') !== -1) { dims.minimizacion += 30; dims.sesgos += 20; }
  if (ev.indexOf('E4B') !== -1) dims.proceso += 20;

  if (d['D1_tipo'] === 'sistemico') dims.minimizacion += 20;
  if (d['D2B_presion'] === 'cede') dims.tecnologia -= 10;
  if (d['D3_tipo'] === 'dpo' || d['D3_tipo'] === 'integral') { dims.minimizacion += 20; dims.sesgos += 20; }
  if (d['D4A_tipo'] === 'sesgo' || d['D4A_tipo'] === 'sistemico') dims.sesgos += 30;
  if (d['D4B_tipo'] === 'discriminacion' || d['D4B_tipo'] === 'integral') dims.sesgos += 20;

  var keys = ['tecnologia','proceso','gobernanza','minimizacion','sesgos'];
  for (var i = 0; i < keys.length; i++) {
    if (dims[keys[i]] < 5) dims[keys[i]] = 5;
    if (dims[keys[i]] > 95) dims[keys[i]] = 95;
  }

  // Determinar perfil
  var perfil, descPerfil, momentos = [];
  var maxDim = 'proceso';
  var maxVal = 0;
  for (var j = 0; j < keys.length; j++) {
    if (dims[keys[j]] > maxVal) { maxVal = dims[keys[j]]; maxDim = keys[j]; }
  }

  var esIntegral = dims.minimizacion > 50 && dims.sesgos > 40 && dims.gobernanza > 40;
  var esProceso = dims.proceso > 50 && dims.minimizacion < 40;
  var esControles = dims.gobernanza > 50 && dims.sesgos < 30;

  if (esIntegral) {
    perfil = 'Auditor integral';
    descPerfil = 'Has combinado an\u00e1lisis de proceso, legitimidad del tratamiento y decisiones organizativas. Has visto la conexi\u00f3n entre los datos del comit\u00e9 y la filtraci\u00f3n final. Perfil de alta madurez en gobernanza de datos de personas.';
  } else if (esProceso) {
    perfil = 'Auditor de proceso';
    descPerfil = 'Has identificado los fallos en el dise\u00f1o antes que en las personas. Detectas problemas sist\u00e9micos con facilidad. Riesgo: puedes subestimar los incumplimientos contractuales inmediatos y el principio de minimizaci\u00f3n.';
  } else {
    perfil = 'Auditor de controles';
    descPerfil = 'Has centrado la investigaci\u00f3n en accesos, contratos y flujos formales. S\u00f3lido en cumplimiento. Tendencia a buscar el fallo en el \u00faltimo eslab\u00f3n visible. Riesgo: perder de vista la legitimidad del tratamiento original.';
  }

  // Momentos decisivos
  if (d['D1_tipo'] === 'sistemico') momentos.push({ ok: true, texto: 'Detectaste desde el primer expediente que el problema era estructural, no puntual.' });
  else momentos.push({ ok: false, texto: 'En el primer expediente focalizaste en una fase del proceso en lugar de cuestionar el dise\u00f1o global.' });

  if (d['D2B_presion'] === 'proceso' || d['D2B_presion'] === 'alternativa') momentos.push({ ok: true, texto: 'Resististe la presi\u00f3n jer\u00e1rquica del Director General con una propuesta alternativa.' });
  else if (d['D2B_presion'] === 'cede') momentos.push({ ok: false, texto: 'Cediste a la presi\u00f3n del Director General sin proponer alternativas de minimizaci\u00f3n.' });

  if (d['D3_tipo'] === 'integral') momentos.push({ ok: true, texto: 'Integraste la infracci\u00f3n formal (contrato) y la material (contenido) como causas independientes y acumulativas.' });
  else if (d['D3_tipo'] === 'juridico') momentos.push({ ok: false, texto: 'Descartaste demasiado r\u00e1pido la dimensi\u00f3n material del incidente al alinearte con la posici\u00f3n de Jur\u00eddico.' });

  if (ev.indexOf('E3C_onenote') !== -1 && ev.indexOf('E3C') !== -1) momentos.push({ ok: true, texto: 'Examinaste el OneNote y la posici\u00f3n del DPO: las dos evidencias clave para identificar la causa ra\u00edz.' });
  else if (ev.indexOf('E3C_onenote') === -1) momentos.push({ ok: false, texto: 'No examinaste el OneNote. Perdiste la evidencia m\u00e1s determinante del caso.' });

  // Tiempo en decisiones bajo presion
  if (estado.tiempos['D2B']) {
    if (estado.tiempos['D2B'] < 8) momentos.push({ ok: false, texto: 'Decidiste en menos de 8 segundos ante la presi\u00f3n jer\u00e1rquica. La rapidez puede indicar automatismo.' });
    else if (estado.tiempos['D2B'] > 30) momentos.push({ ok: true, texto: 'Tomaste tiempo para deliberar ante la presi\u00f3n del Director General.' });
  }

  var labels = ['Tecnolog\u00eda','Proceso','Gobernanza','Minimizaci\u00f3n','Sesgos'];
  var dimVals = [dims.tecnologia, dims.proceso, dims.gobernanza, dims.minimizacion, dims.sesgos];
  var dimColors = ['#19C4D5','#BFB620','#FF751F','#002445','#888888'];

  var html = '<div class="orh-aud-perfil">';
  html += '<h3 class="orh-aud-perfil-titulo">Tu perfil de investigaci\u00f3n</h3>';
  html += '<div class="orh-aud-perfil-nombre">' + perfil + '</div>';
  html += '<p class="orh-aud-perfil-desc">' + descPerfil + '</p>';

  html += '<div class="orh-aud-perfil-mapa">';
  html += '<div class="orh-aud-mapa-titulo">Tu investigaci\u00f3n</div>';
  for (var k = 0; k < labels.length; k++) {
    html += '<div class="orh-aud-mapa-row">';
    html += '<div class="orh-aud-mapa-label">' + labels[k] + '</div>';
    html += '<div class="orh-aud-mapa-bar-wrap">';
    html += '<div class="orh-aud-mapa-bar" style="width:' + dimVals[k] + '%;background:' + dimColors[k] + '"></div>';
    html += '</div>';
    html += '</div>';
  }
  html += '</div>';

  html += '<div class="orh-aud-momentos">';
  html += '<div class="orh-aud-momentos-titulo">Momentos decisivos</div>';
  for (var m = 0; m < momentos.length; m++) {
    var mo = momentos[m];
    html += '<div class="orh-aud-momento ' + (mo.ok ? 'orh-aud-momento-ok' : 'orh-aud-momento-ko') + '">';
    html += (mo.ok ? '&#10003;' : '&#10007;') + ' ' + mo.texto;
    html += '</div>';
  }
  html += '</div>';
  html += '</div>';
  return html;
}

function renderTiempoAgotado() {
  var c = document.getElementById('orh-auditoria');
  if (!c) return;
  c.innerHTML = '<div class="orh-aud-resultado"><div class="orh-aud-res-badge" style="background:#999">Tiempo agotado</div><p>El Comit\u00e9 se reuni\u00f3 sin tu informe. El caso queda sin resolver.</p><button class="orh-aud-btn-secondary" id="btn-reiniciar-to">Intentarlo de nuevo</button></div>';
  document.getElementById('btn-reiniciar-to').addEventListener('click', function() {
    estado.expediente = 0;
    estado.segundosRestantes = 3600;
    estado.hipotesis = { H1: 25, H2: 25, H3: 25, H4: 25 };
    estado.decisiones = {};
    estado.tiempos = {};
    estado.evidenciasExaminadas = [];
    estado.ts = {};
    render();
  });
}

// INIT
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', render);
} else {
  render();
}

})();
