{% from "components/_tabs.html" import tabs_intro %}
<header class="page-heading"><p class="eyebrow">PREFERENCIAS</p><h1>Configuración</h1><p>{% if ONLINE_MODE %}Ajusta la accesibilidad, el sonido y tus preferencias personales. Las reglas y la administración del universo corresponden al equipo del servidor.{% else %}Ajusta accesibilidad, sonido, reglas y almacenamiento de esta partida local.{% endif %}</p></header>
<div class="settings-grid" data-tab-scope="settings">
  {{ tabs_intro('settings', 'Apartados de configuración', 'Las flechas recorren las pestañas; Enter o Espacio abre la elegida. Tab entra en el apartado activo.') }}
  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-interfaz" data-tab-label="Interfaz">
  <section class="panel"><h2>Accesibilidad y navegación rápida</h2><p>Contraste, tamaño de texto, avisos, paneles, atajos y comportamiento de los desplegables se guardan en la partida portátil. Las teclas rápidas funcionan desde selectores y se desactivan mientras escribes texto.</p><label for="settings-navigation-mode">Organización de las pantallas<select id="settings-navigation-mode" data-navigation-mode-select aria-describedby="settings-navigation-mode-help"><option value="classic" {% if interface_preferences.navigation_mode == 'classic' %}selected{% endif %}>Modo normal: todos los apartados seguidos</option><option value="tabs" {% if interface_preferences.navigation_mode == 'tabs' %}selected{% endif %}>Modo por pestañas: un apartado cada vez</option></select><small id="settings-navigation-mode-help">La elección se guarda dentro de esta partida. Ambos modos contienen exactamente las mismas funciones.</small></label><div class="stacked-actions"><button class="button" type="button" data-action="text-size" aria-pressed="false">Alternar texto ampliado</button><button class="button" type="button" data-action="contrast" aria-pressed="false">Alternar alto contraste</button><button class="button" type="button" data-action="updates" aria-pressed="false">Pausar o reanudar avisos</button><button class="button" type="button" data-action="compact-panels" aria-pressed="true">Mostrar todos los paneles abiertos</button><button class="button" type="button" data-action="select-current-first" aria-pressed="true">Mantener orden fijo en desplegables</button><button class="button" type="button" data-action="shortcut-shift" aria-pressed="{{ 'true' if interface_preferences.shortcut_shift else 'false' }}" aria-describedby="shortcut-mode-description">{{ 'Quitar Shift adicional de todos los atajos' if interface_preferences.shortcut_shift else 'Añadir Shift a todos los atajos' }}</button><button class="button" type="button" data-action="shortcut-help" aria-haspopup="dialog" aria-controls="shortcut-dialog">Abrir tabla de teclas</button><a class="button" href="{{ url_for('game_view', section='help') }}">Abrir ayuda breve</a><a class="button" href="{{ url_for('game_view', section='manual') }}" data-open-manual target="_blank" rel="noopener" aria-description="Se abre en una pestaña nueva">Abrir manual completo en otra pestaña</a></div><p id="shortcut-mode-description" data-shortcut-mode-description>Además del modificador global puedes asignar una combinación distinta a cada acción en la tabla siguiente.</p><p>La opción activa se coloca al principio de cada desplegable para que puedas recorrer todas las alternativas hacia abajo sin alterar el valor guardado. {{ shortcut_map.galaxy }} abre Galaxia y lleva el foco al título de Galaxia.</p></section>
  </div>

  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-teclado" data-tab-label="Teclado">
  <section class="panel panel-wide" aria-labelledby="bindings-title"><h2 id="bindings-title">Remapeo completo de teclas</h2><p>Elige modificadores y una tecla mediante controles normales; no es necesario pulsar varias teclas a la vez. El juego rechaza duplicados y combinaciones reservadas.</p><div class="table-wrap"><table><caption>Asignaciones editables</caption><thead><tr><th scope="col">Acción</th><th scope="col">Combinación actual</th><th scope="col">Nueva combinación</th></tr></thead><tbody>{% for binding in input_bindings %}<tr><th scope="row">{{ binding.label }}</th><td>{{ shortcut_map[binding.action] }}</td><td><form method="post" action="{{ url_for('binding_save_action') }}" class="inline-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="action_key" value="{{ binding.action }}"><label class="check-label"><input type="checkbox" name="ctrl" value="1" {% if binding.ctrl %}checked{% endif %}> Control</label><label class="check-label"><input type="checkbox" name="alt" value="1" {% if binding.alt %}checked{% endif %}> Alt</label><label class="check-label"><input type="checkbox" name="shift" value="1" {% if binding.shift %}checked{% endif %}> Shift</label><label>Tecla <select name="key_code">{% for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' %}<option value="Key{{ letter }}" {% if binding.code == 'Key' ~ letter %}selected{% endif %}>{{ letter }}</option>{% endfor %}{% for digit in range(10) %}<option value="Digit{{ digit }}" {% if binding.code == 'Digit' ~ digit %}selected{% endif %}>{{ digit }}</option>{% endfor %}{% for number in range(1,13) %}<option value="F{{ number }}" {% if binding.code == 'F' ~ number %}selected{% endif %}>F{{ number }}</option>{% endfor %}</select></label><button class="button button-small" type="submit">Guardar</button></form></td></tr>{% endfor %}</tbody></table></div><form method="post" action="{{ url_for('bindings_restore_action') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="button button-danger" type="submit">Restaurar todos los atajos predeterminados</button></form></section>
  </div>

  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-asistencia" data-tab-label="Asistencia">
  <section class="panel panel-wide" aria-labelledby="assistance-title"><h2 id="assistance-title">Perfil de asistencia independiente de la dificultad</h2><p>Estas ayudas pueden cambiarse sin reiniciar ni perder progreso.{% if not ONLINE_MODE %} El modo historia impide que la IA ataque al jugador, pero no reduce sus demás capacidades.{% else %} En el servidor todos los jugadores conservan las mismas reglas competitivas, por lo que la pausa global individual y la inmunidad narrativa no están disponibles.{% endif %}</p><form method="post" action="{{ url_for('assistance_save_action') }}" class="stacked-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><label>Perfil <select name="profile"><option value="standard" {% if assistance_profile.profile == 'standard' %}selected{% endif %}>Estándar</option><option value="guided" {% if assistance_profile.profile == 'guided' %}selected{% endif %}>Guiado</option>{% if not ONLINE_MODE %}<option value="story" {% if assistance_profile.profile == 'story' %}selected{% endif %}>Historia</option>{% endif %}<option value="custom" {% if assistance_profile.profile == 'custom' %}selected{% endif %}>Personalizado</option></select></label><label>Confirmar gastos superiores al porcentaje de reservas <input type="number" name="confirm_spend_percent" min="0" max="100" value="{{ assistance_profile.confirm_spend_percent }}"></label><div class="check-grid"><label class="check-label"><input type="checkbox" name="early_warnings" value="1" {% if assistance_profile.early_warnings %}checked{% endif %}> Avisos anticipados de escasez, hambre, energía, ecología y caducidad</label>{% if not ONLINE_MODE %}<label class="check-label"><input type="checkbox" name="auto_pause_events" value="1" {% if assistance_profile.auto_pause_events %}checked{% endif %}> Pausar automáticamente la simulación mientras haya una decisión narrativa</label>{% endif %}<label class="check-label"><input type="checkbox" name="expanded_explanations" value="1" {% if assistance_profile.expanded_explanations %}checked{% endif %}> Explicaciones ampliadas de requisitos</label><label class="check-label"><input type="checkbox" name="consequence_forecasts" value="1" {% if assistance_profile.consequence_forecasts %}checked{% endif %}> Previsión de consecuencias políticas y militares</label><label class="check-label"><input type="checkbox" name="confirm_fleet_recall" value="1" {% if assistance_profile.confirm_fleet_recall %}checked{% endif %}> Pedir revisión completa antes de retirar una flota</label>{% if not ONLINE_MODE %}<label class="check-label"><input type="checkbox" name="story_mode" value="1" {% if assistance_profile.story_mode %}checked{% endif %}> Modo historia sin ataques de IA contra el jugador</label>{% endif %}</div><button class="button button-primary" type="submit">Guardar perfil de asistencia</button></form></section>
  </div>

  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-audio" data-tab-label="Audio">
  <section id="sound-settings" class="panel" aria-labelledby="sound-settings-title"><div data-audio-surface>
    <p class="eyebrow">PAISAJE SONORO</p><h2 id="sound-settings-title">Música y efectos identificativos</h2><p>Seis músicas pueden sonar aleatoriamente. Cambiar o terminar una pista no genera anuncios del lector de pantalla. Los {{ EFFECT_SOUNDS|length }} efectos identifican acciones y resultados concretos sin depender solo de información visual.</p>
    <form method="post" action="{{ url_for('audio_settings_action') }}" class="stacked-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
      <label class="check-label"><input type="checkbox" name="music_enabled" value="1" data-audio-enabled="music" {% if audio_preferences.music_enabled %}checked{% endif %}> Activar música</label>
      <label for="settings-music-track">Pista musical<select id="settings-music-track" name="music_track" data-audio-track>{% for key, track in MUSIC_TRACKS.items() %}<option value="{{ key }}" {% if key == audio_preferences.music_track %}selected{% endif %}>{{ track.name }} — {{ track.description }}</option>{% endfor %}</select></label>
      <label class="check-label"><input type="checkbox" name="music_random" value="1" data-audio-random {% if audio_preferences.music_random %}checked{% endif %}> Selección aleatoria al terminar cada pista</label>
      <label for="settings-music-volume">Volumen de música: <output id="settings-music-output" for="settings-music-volume">{{ audio_preferences.music_volume }}</output> %<input id="settings-music-volume" name="music_volume" type="range" min="0" max="100" value="{{ audio_preferences.music_volume }}" data-volume-output="settings-music-output" data-audio-volume="music"></label>
      <div class="button-row"><button class="button" type="button" data-action="audio-play-selected">Reproducir pista</button><button class="button" type="button" data-action="audio-next">Siguiente pista</button></div>
      <label class="check-label"><input type="checkbox" name="effects_enabled" value="1" data-audio-enabled="effects" {% if audio_preferences.effects_enabled %}checked{% endif %}> Activar efectos</label>
      <label for="settings-effects-volume">Volumen de efectos: <output id="settings-effects-output" for="settings-effects-volume">{{ audio_preferences.effects_volume }}</output> %<input id="settings-effects-volume" name="effects_volume" type="range" min="0" max="100" value="{{ audio_preferences.effects_volume }}" data-volume-output="settings-effects-output" data-audio-volume="effects"></label>
      <label for="settings-interface-volume">Volumen de interfaz: <output id="settings-interface-output" for="settings-interface-volume">{{ audio_preferences.interface_volume }}</output> %<input id="settings-interface-volume" name="interface_volume" type="range" min="0" max="100" value="{{ audio_preferences.interface_volume }}" data-volume-output="settings-interface-output" data-audio-volume="interface"></label>
      <label for="settings-notification-volume">Volumen de avisos: <output id="settings-notification-output" for="settings-notification-volume">{{ audio_preferences.notification_volume }}</output> %<input id="settings-notification-volume" name="notification_volume" type="range" min="0" max="100" value="{{ audio_preferences.notification_volume }}" data-volume-output="settings-notification-output" data-audio-volume="notification"></label>
      <label for="settings-combat-volume">Volumen de combate: <output id="settings-combat-output" for="settings-combat-volume">{{ audio_preferences.combat_volume }}</output> %<input id="settings-combat-volume" name="combat_volume" type="range" min="0" max="100" value="{{ audio_preferences.combat_volume }}" data-volume-output="settings-combat-output" data-audio-volume="combat"></label>
      <label for="settings-ambient-volume">Volumen de ambiente: <output id="settings-ambient-output" for="settings-ambient-volume">{{ audio_preferences.ambient_volume }}</output> %<input id="settings-ambient-volume" name="ambient_volume" type="range" min="0" max="100" value="{{ audio_preferences.ambient_volume }}" data-volume-output="settings-ambient-output" data-audio-volume="ambient"></label>
      <label class="check-label"><input type="checkbox" name="mono_audio" value="1" data-audio-option="mono" {% if audio_preferences.mono_audio %}checked{% endif %}> Mezclar toda la salida en mono</label>
      <label class="check-label"><input type="checkbox" name="screen_reader_ducking" value="1" data-audio-option="ducking" {% if audio_preferences.screen_reader_ducking %}checked{% endif %}> Reducir el audio mientras se anuncia información al lector de pantalla</label>
      <button class="button" type="button" data-action="speech-duck">Silenciar durante 20 segundos mientras lee el lector</button>
      <label for="settings-effect-preview">Efecto de prueba rápida<select id="settings-effect-preview" data-effect-preview aria-describedby="settings-effect-details">{% for key, effect in EFFECT_SOUNDS.items() %}<option value="{{ key }}">{{ effect.name }} — {{ effect.actions }}</option>{% endfor %}</select></label><p id="settings-effect-details" class="muted" data-effect-details></p><button class="button" type="button" data-action="audio-preview-effect" aria-describedby="settings-effect-details">Escuchar efecto seleccionado</button>
      <button class="button button-primary" type="submit">Guardar configuración de audio</button>
    </form><p class="muted">Puedes reemplazar individualmente los WAV conservando los nombres descritos en <code>static\audio\LEEME.txt</code>.</p>
  </div></section>

  <section class="panel panel-wide" aria-labelledby="sound-catalog-title">
    <p class="eyebrow">APRENDIZAJE AUDITIVO</p><h2 id="sound-catalog-title">Catálogo de sonidos y acciones</h2>
    <p>Cada efecto tiene una forma sonora diferente. Ábrelo para conocer cuándo se reproduce, cómo reconocerlo y probarlo de manera individual.</p>
    <details class="sound-catalog-details"><summary>Mostrar el catálogo completo de {{ EFFECT_SOUNDS|length }} sonidos</summary>
      <p id="effect-preview-status" class="sound-preview-status" role="status" aria-live="polite" aria-atomic="true">Ningún sonido de prueba se está reproduciendo.</p>
      <div class="sound-catalog-grid">
        {% for key, effect in EFFECT_SOUNDS.items() %}<article class="sound-card" data-sound-card="{{ key }}" aria-labelledby="sound-{{ key }}-title">
          <p class="eyebrow">{{ effect.category }}</p><h3 id="sound-{{ key }}-title">{{ effect.name }}</h3>
          <p id="sound-{{ key }}-actions"><strong>Se oye en:</strong> {{ effect.actions }}</p>
          <p><strong>Cómo reconocerlo:</strong> {{ effect.character }}</p>
          <button class="button button-secondary" type="button" data-action="audio-preview-effect" data-effect-key="{{ key }}" aria-describedby="sound-{{ key }}-actions">Probar sonido: {{ effect.name }}</button>
        </article>{% endfor %}
      </div>
    </details>
  </section>

  <section class="panel panel-wide" aria-labelledby="audio-history-title"><h2 id="audio-history-title">Historial textual de señales sonoras</h2><p>Estas descripciones permiten revisar los avisos importantes aunque el sonido estuviera silenciado.</p>{% if audio_signal_history %}<ol>{% for signal in audio_signal_history %}<li><time datetime="{{ signal.created_at|date_iso }}">{{ signal.created_at|date_label }}</time>: <strong>{{ EFFECT_SOUNDS[signal.cue_key].name if signal.cue_key in EFFECT_SOUNDS else signal.cue_key }}</strong>. {{ signal.description }}</li>{% endfor %}</ol>{% else %}<p>Todavía no hay señales registradas.</p>{% endif %}</section>

  <section class="panel panel-wide" aria-labelledby="audio-profile-title"><h2 id="audio-profile-title">Perfil de audio exportable</h2><p>El código contiene solo preferencias de sonido. Puedes copiarlo a otra partida o equipo sin compartir el universo.</p><div class="button-row"><form method="post" action="{{ url_for('audio_profile_export_action') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="button" type="submit">Crear código de mi perfil</button></form></div>{% if audio_profile_code %}<label>Código exportado<textarea readonly rows="4" spellcheck="false">{{ audio_profile_code }}</textarea></label>{% endif %}<form method="post" action="{{ url_for('audio_profile_import_action') }}" class="stacked-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><label>Código que quieres importar<textarea name="audio_profile_code" rows="4" spellcheck="false" required></textarea></label><button class="button button-primary" type="submit">Importar perfil de audio</button></form></section>
  </div>

  {% if not ONLINE_MODE %}
  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-universo" data-tab-label="Universo">
  <section class="panel"><h2>Partida y guardado protegido</h2><p>El universo se guarda después de cada acción en un archivo <code>.dat</code> cifrado con AES-GCM y autenticado. La clave maestra queda bajo DPAPI en Windows, Keychain en macOS o Secret Service en Linux; la aplicación rechaza cualquier alteración.</p><p>Para continuar en otro ordenador o sistema, detén el servidor y usa <strong>Transferir partidas entre ordenadores</strong> en el panel wxPython; crea un <code>.eitransfer</code> protegido con contraseña.</p><p class="portable-path"><strong>Ubicación activa:</strong> <code>{{ storage_path }}</code></p><dl class="settings-list"><div><dt>Universo</dt><dd>{{ game.name }}</dd></div><div><dt>Rivales IA</dt><dd>{{ rival_count }}</dd></div><div><dt>Mundos-granja IA</dt><dd>{{ farm_rival_count }}</dd></div><div><dt>Galaxias</dt><dd>{{ config.get('galaxy_count',1) }}</dd></div><div><dt>Sistemas por galaxia</dt><dd>{{ game.galaxy_size }}</dd></div><div><dt>Al cerrar el servidor</dt><dd>{{ 'Universo detenido' if config.get('offline_mode','frozen') == 'frozen' else 'Tiempo real' }}</dd></div><div><dt>Velocidad</dt><dd>×{{ game.speed }}</dd></div><div><dt>Economía</dt><dd>×{{ config.get('economy_multiplier',1.0) }}</dd></div><div><dt>Investigación</dt><dd>×{{ config.get('research_speed_multiplier',1.0) }}</dd></div><div><dt>Flotas</dt><dd>×{{ config.get('fleet_speed_multiplier',1.0) }}</dd></div><div><dt>Dificultad</dt><dd>{{ {'easy':'Relajada','normal':'Equilibrada','hard':'Veterana'}[game.difficulty] }}</dd></div><div><dt>Agresividad IA</dt><dd>{{ config.get('ai_aggression','normal') }}</dd></div><div><dt>Eventos</dt><dd>{{ config.get('event_frequency','normal') }}</dd></div><div><dt>Megaproyectos</dt><dd>{{ completed_projects }}</dd></div><div><dt>Estado</dt><dd>{{ 'En marcha' if game.status == 'active' else 'Pausado' }}</dd></div></dl><form method="post" action="{{ url_for('settings_action') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="action" value="toggle_pause"><button class="button button-primary" type="submit">{{ 'Pausar universo' if game.status == 'active' else 'Reanudar universo' }}</button></form></section>

  <section class="panel"><h2>Modificar reglas en curso</h2><p>Los cambios afectan al futuro y nunca eliminan el progreso guardado.</p><form method="post" action="{{ url_for('settings_action') }}" class="stacked-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="action" value="universe_rules">
    <label>Velocidad temporal<select name="speed">{% for value in [1,5,10,20,50] %}<option value="{{ value }}" {% if game.speed == value %}selected{% endif %}>×{{ value }}</option>{% endfor %}</select></label><label>Tiempo mientras el servidor está cerrado<select name="offline_mode" aria-describedby="settings-offline-mode-help"><option value="frozen" {% if config.get('offline_mode','frozen') == 'frozen' %}selected{% endif %}>Universo detenido: congelar absolutamente todo</option><option value="realtime" {% if config.get('offline_mode') == 'realtime' %}selected{% endif %}>Tiempo real: reconstruir producción, actividad y ataques</option></select><small id="settings-offline-mode-help">La elección se aplica en el siguiente cierre del servidor. La pausa manual siempre congela el universo.</small></label><label>Multiplicador económico<select name="economy_multiplier">{% for value in [0.5,1,2,4] %}<option value="{{ value }}" {% if config.get('economy_multiplier',1)|float == value %}selected{% endif %}>×{{ value }}</option>{% endfor %}</select></label><label>Velocidad de flotas<select name="fleet_speed_multiplier">{% for value in [0.5,1,2,4] %}<option value="{{ value }}" {% if config.get('fleet_speed_multiplier',1)|float == value %}selected{% endif %}>×{{ value }}</option>{% endfor %}</select></label><label>Velocidad de investigación<select name="research_speed_multiplier">{% for value in [0.5,1,2,4] %}<option value="{{ value }}" {% if config.get('research_speed_multiplier',1)|float == value %}selected{% endif %}>×{{ value }}</option>{% endfor %}</select><small>Independiente de economía, construcción y vuelos.</small></label>
    <label>Riqueza minera<select name="resource_richness">{% for value, label in [('scarce','Escasa'),('standard','Estándar'),('abundant','Abundante'),('lavish','Excepcional')] %}<option value="{{ value }}" {% if config.get('resource_richness','standard') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Fertilidad agrícola<select name="agricultural_richness">{% for value, label in [('scarce','Hostil'),('standard','Estándar'),('abundant','Fértil'),('lavish','Edénica')] %}<option value="{{ value }}" {% if config.get('agricultural_richness','standard') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Recursos estratégicos<select name="rare_resource_richness">{% for value, label in [('scarce','Muy raros'),('standard','Estándar'),('abundant','Abundantes'),('wild','Desbordados')] %}<option value="{{ value }}" {% if config.get('rare_resource_richness','standard') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label>
    <label>Agresividad IA<select name="ai_aggression">{% for value, label in [('peaceful','Pacífica'),('low','Prudente'),('normal','Competitiva'),('high','Agresiva'),('relentless','Implacable')] %}<option value="{{ value }}" {% if config.get('ai_aggression','normal') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Adaptación IA<select name="ai_adaptability">{% for value, label in [('predictable','Predecible'),('adaptive','Adaptativa'),('chaotic','Cambiante')] %}<option value="{{ value }}" {% if config.get('ai_adaptability','adaptive') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Eventos<select name="event_frequency">{% for value, label in [('off','Desactivados'),('low','Poco frecuentes'),('normal','Normales'),('high','Frecuentes'),('chaotic','Caóticos')] %}<option value="{{ value }}" {% if config.get('event_frequency','normal') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Volatilidad de expediciones<select name="expedition_volatility">{% for value, label in [('safe','Segura'),('normal','Normal'),('dangerous','Peligrosa'),('anomalous','Anómala y extrema')] %}<option value="{{ value }}" {% if config.get('expedition_volatility','normal') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Presión ecológica<select name="ecology_pressure">{% for value, label in [('relaxed','Relajada'),('standard','Realista'),('harsh','Severa'),('catastrophic','Catastrófica')] %}<option value="{{ value }}" {% if config.get('ecology_pressure','standard') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Objetivo<select name="victory_mode">{% for value, label in [('sandbox','Universo abierto'),('score','Puntuación'),('domination','Dominación')] %}<option value="{{ value }}" {% if config.get('victory_mode','sandbox') == value %}selected{% endif %}>{{ label }}</option>{% endfor %}</select></label><label>Puntos de victoria<input name="victory_score" type="number" min="5000" max="1000000" step="5000" value="{{ config.get('victory_score',50000) }}"></label><button class="button" type="submit">Guardar reglas</button>
  </form></section>

  <section class="panel panel-wide" aria-labelledby="universe-eras-title">
    <p class="eyebrow">REGLAS TEMPORALES REGISTRADAS</p>
    <h2 id="universe-eras-title">Eras del universo</h2>
    <p>Las eras afectan por igual al jugador y a todas las IA. Se pueden cancelar mientras estén programadas; una era activa no se reescribe y siempre queda en el historial.</p>
    <form method="post" action="{{ url_for('settings_action') }}" class="stacked-form">
      <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
      <input type="hidden" name="action" value="schedule_era">
      <label>Era temporal
        <select name="era_key">{% for key, era in universe_era_catalog.items() %}<option value="{{ key }}">{{ era.name }} — {{ era.description }}</option>{% endfor %}</select>
      </label>
      <label>Comenzar dentro de, minutos<input name="starts_in_minutes" type="number" min="0" max="10080" value="1"></label>
      <label>Duración, minutos<input name="duration_minutes" type="number" min="1" max="10080" value="60"></label>
      <button class="button button-primary" type="submit">Programar era para todo el universo</button>
    </form>
    {% if active_era_modifiers %}<p class="notice"><strong>Modificadores activos:</strong> {% for key, value in active_era_modifiers.items() %}{{ key }} ×{{ value }}{% if not loop.last %}; {% endif %}{% endfor %}.</p>{% endif %}
    {% if universe_eras %}
    <div class="table-wrap"><table><caption>Historial de eras, incluidas las programadas y canceladas.</caption><thead><tr><th scope="col">Era</th><th scope="col">Estado</th><th scope="col">Comienza</th><th scope="col">Finaliza</th><th scope="col">Acción</th></tr></thead><tbody>
      {% for era in universe_eras %}<tr><th scope="row">{{ universe_era_catalog.get(era.era_key,{}).get('name',era.era_key) }}</th><td>{{ {'scheduled':'Programada','active':'Activa','completed':'Completada','cancelled':'Cancelada'}.get(era.status,era.status) }}</td><td><time datetime="{{ era.starts_at|date_iso }}">{{ era.starts_at|date_label }}</time></td><td><time datetime="{{ era.ends_at|date_iso }}">{{ era.ends_at|date_label }}</time></td><td>{% if era.status == 'scheduled' %}<form method="post" action="{{ url_for('settings_action') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="action" value="cancel_era"><input type="hidden" name="era_id" value="{{ era.id }}"><button class="button button-danger" type="submit">Cancelar era programada</button></form>{% else %}Historial protegido{% endif %}</td></tr>{% endfor %}
    </tbody></table></div>
    {% else %}<p class="empty-state">Aún no se han programado eras temporales.</p>{% endif %}
  </section>

  <section class="panel" aria-labelledby="fixed-rules-title">
    <h2 id="fixed-rules-title">Geografía y escombros fijados al crear el universo</h2>
    <p>Estas reglas no se cambian a mitad de partida porque alterarían rutas en curso, combustible y expectativas de combate.</p>
    <dl class="settings-list">
      <div><dt>Sistemas</dt><dd>{{ 'Circulares' if config.get('system_topology','linear') == 'circular' else 'Lineales' }}</dd></div>
      <div><dt>Galaxias</dt><dd>{{ 'Circulares' if config.get('galaxy_topology','linear') == 'circular' else 'Lineales' }}</dd></div>
      <div><dt>Escombros de naves</dt><dd>{{ config.get('fleet_debris_percent',30) }} %</dd></div>
      <div><dt>Escombros de defensas</dt><dd>{{ config.get('defense_debris_percent',0) }} %</dd></div>
      <div><dt>Deuterio recuperable</dt><dd>{{ config.get('deuterium_debris_percent',0) }} %</dd></div>
    </dl>
  </section>

  {% set offline_report = config.get('last_offline_report') %}
  {% if offline_report %}
  <section class="panel panel-wide" aria-labelledby="offline-report-title">
    <h2 id="offline-report-title">Último período con el servidor cerrado</h2>
    <p>Duración registrada: <strong>{{ offline_report.get('elapsed_seconds',0)|duration }}</strong>.</p>
    {% if offline_report.get('mode') == 'frozen' %}
      <div class="notice notice-success" role="status"><strong>Universo detenido.</strong> Recursos, población, colas, flotas, expediciones, protecciones, IA y acontecimientos conservaron exactamente su tiempo restante.</div>
    {% elif offline_report.get('mode') == 'realtime' %}
      <p>El motor reconstruyó la ausencia mediante una semilla reproducible de azar y rondas estadísticas limitadas para evitar bloquear el inicio en universos enormes. Las probabilidades, la agresividad, las relaciones, las flotas disponibles y las defensas decidieron lo ocurrido.</p>
      <dl class="settings-list">
        <div><dt>Rondas estadísticas</dt><dd>{{ offline_report.get('simulated_rounds',0) }}</dd></div>
        <div><dt>Turnos teóricos por IA</dt><dd>{{ offline_report.get('expected_turns_per_ai',0) }}</dd></div>
        <div><dt>Decisiones IA ejecutadas</dt><dd>{{ offline_report.get('ai_actions',0) }}</dd></div>
        <div><dt>Colas completadas</dt><dd>{{ offline_report.get('queues_completed',0) }}</dd></div>
        <div><dt>Flotas resueltas</dt><dd>{{ offline_report.get('fleets_resolved',0) }}</dd></div>
        <div><dt>Batallas con tu imperio</dt><dd>{{ offline_report.get('battles_involving_player',0) }}</dd></div>
        <div><dt>Ataques recibidos y resueltos</dt><dd>{{ offline_report.get('attacks_against_player',0) }}</dd></div>
        <div><dt>Ataques aún en camino</dt><dd>{{ offline_report.get('incoming_attacks',0) }}</dd></div>
        <div><dt>Tirada de azar de la ausencia</dt><dd>{{ offline_report.get('fortune_roll',0) }} de 100</dd></div>
      </dl>
      {% set delta = offline_report.get('resource_delta',{}) %}
      <p><strong>Cambio neto del imperio humano:</strong> metal {{ delta.get('metal',0)|number }}, cristal {{ delta.get('crystal',0)|number }}, deuterio {{ delta.get('deuterium',0)|number }}, alimento {{ delta.get('food',0)|number }} y población {{ delta.get('population',0)|number }}.</p>
    {% else %}
      <p>La partida estaba pausada manualmente; continuará congelada hasta que pulses <strong>Reanudar universo</strong>.</p>
    {% endif %}
  </section>
  {% endif %}

  <section class="panel"><h2>Expandir el universo existente</h2><p>Añade rivales, cooperativas agrícolas, galaxias y sistemas sin borrar ni mover planetas. El máximo es {{ UNIVERSE_LIMITS.ai_rivals }} rivales, {{ UNIVERSE_LIMITS.farm_ai }} cooperativas, {{ UNIVERSE_LIMITS.galaxies }} galaxias y {{ UNIVERSE_LIMITS.systems_per_galaxy }} sistemas por galaxia.</p><form method="post" action="{{ url_for('settings_action') }}" class="stacked-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="action" value="expand_universe"><label>Nuevos imperios IA<select name="additional_ai"><option value="0">Ninguno</option><option value="4">Añadir 4</option><option value="8">Añadir 8</option><option value="16">Añadir 16</option><option value="32">Añadir hasta 32</option><option value="64">Añadir hasta 64</option></select></label><label>Nuevos mundos-granja IA<select name="additional_farms"><option value="0">Ninguno</option><option value="2">Añadir 2</option><option value="4">Añadir 4</option><option value="8">Añadir 8</option><option value="16">Añadir hasta 16</option><option value="32">Añadir hasta 32</option><option value="64">Añadir hasta 64</option></select></label><label>Total de galaxias<select name="galaxy_count">{% for value in range(config.get('galaxy_count',1),UNIVERSE_LIMITS.galaxies + 1) %}<option value="{{ value }}" {% if value == config.get('galaxy_count',1) %}selected{% endif %}>{{ value }}</option>{% endfor %}</select></label><label>Sistemas por galaxia<input name="galaxy_size" type="number" min="{{ game.galaxy_size }}" max="{{ UNIVERSE_LIMITS.systems_per_galaxy }}" value="{{ game.galaxy_size }}" required></label><button class="button button-primary" type="submit">Confirmar expansión</button></form></section>
  <section class="panel"><h2>Renombrar planeta</h2><form method="post" action="{{ url_for('settings_action') }}" class="stacked-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="action" value="rename_planet"><label>Nuevo nombre<input name="planet_name" value="{{ planet.name }}" maxlength="40" required></label><button class="button" type="submit">Guardar nombre</button></form></section>
  </div>

  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-trampas" data-tab-label="Modo trampas">
  <section id="cheat-mode" class="panel panel-wide" aria-labelledby="cheat-mode-title">
    <p class="eyebrow">EDICIÓN LIBRE Y LOCAL</p>
    <h2 id="cheat-mode-title">Modo trampas</h2>
    {% if not cheat_mode_enabled %}
      <p>Este modo permite cambiar directamente el progreso del imperio humano y de cualquiera de sus planetas. La activación queda guardada en este universo y sus informes indicarán que se utilizaron trampas.</p>
      <p id="cheat-activation-help">Para confirmar que la activación es intencionada, escribe <strong>TRAMPAS</strong> exactamente en mayúsculas. La palabra no se guarda.</p>
      <form method="post" action="{{ url_for('cheat_activate_action') }}" class="stacked-form">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
        <label for="cheat-activation-phrase">Palabra de activación
          <input id="cheat-activation-phrase" name="activation_phrase" type="text" required pattern="TRAMPAS" autocomplete="off" autocapitalize="characters" spellcheck="false" aria-describedby="cheat-activation-help">
        </label>
        <button class="button button-primary" type="submit">Validar y activar el modo trampas</button>
      </form>
    {% else %}
      <div class="notice notice-warning" role="status"><strong>Modo trampas activo.</strong> Los cambios se aplican inmediatamente y no consumen recursos. Esta partida permanecerá marcada aunque desactives después el editor.</div>
      <p>Estás editando <strong>{{ planet.name }}</strong>. Para modificar otro mundo, selecciónalo primero en el control “Planeta activo”. Los niveles imperiales de investigación y los recursos estratégicos se comparten entre todos tus planetas.</p>
      <form method="post" action="{{ url_for('cheat_deactivate_action') }}">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
        <button class="button button-danger" type="submit">Desactivar el modo trampas</button>
      </form>
    {% endif %}
  </section>

  {% if cheat_mode_enabled %}
  <section class="panel panel-wide" aria-labelledby="cheat-editor-title">
    <h2 id="cheat-editor-title">Editor completo de progreso</h2>
    <p>Cada campo establece el valor final: puedes aumentarlo, reducirlo o escribir cero. En modo normal se muestran todos los apartados seguidos; en modo por pestañas se presenta uno cada vez, igual que en el resto del juego. Los límites amplios protegen la base de datos de números inválidos, pero no aplican costes ni requisitos normales.</p>
    <div class="cheat-editor-tabs" data-tab-scope="cheat-editor">
      {{ tabs_intro('cheat-editor', 'Apartados del editor de trampas', 'Flecha izquierda y derecha recorren las pestañas; Inicio y Fin van a los extremos; Enter o Espacio abre el apartado; Tab entra en sus campos.') }}
      <form id="cheat-progress-form" method="post" action="{{ url_for('cheat_save_action') }}" class="stacked-form">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">

        <section class="cheat-tab-panel" data-tab-panel data-tab-id="trampas-recursos" data-tab-label="Recursos y planeta" aria-labelledby="cheat-resources-title">
        <h3 id="cheat-resources-title">Recursos, población y entorno del planeta</h3>
        <div class="form-grid">
          {% for field, definition in cheat_state.planet_fields.items() %}
            <label for="cheat-planet-{{ field }}">{{ definition[0] }}
              <input id="cheat-planet-{{ field }}" name="planet_{{ field }}" type="number" min="{{ definition[1] }}" max="{{ definition[2] }}" step="1" value="{{ cheat_state.planet[field]|int }}">
            </label>
          {% endfor %}
          <label for="cheat-planet-policy">Política planetaria
            <select id="cheat-planet-policy" name="planet_policy">
              {% for key, policy in POLICIES.items() %}<option value="{{ key }}" {% if cheat_state.planet.policy == key %}selected{% endif %}>{{ policy.name }}</option>{% endfor %}
            </select>
          </label>
          <label for="cheat-empire-credits">Créditos imperiales
              <input id="cheat-empire-credits" name="empire_credits" type="number" min="0" max="1000000000000000" step="1" value="{{ cheat_state.empire.credits }}">
          </label>
        </div>
        </section>

        <section class="cheat-tab-panel" data-tab-panel data-tab-id="trampas-edificios" data-tab-label="Edificios" aria-labelledby="cheat-buildings-title">
        <h3 id="cheat-buildings-title">Edificios y estructuras lunares</h3>
        <div class="form-grid">
          {% for key, definition in BUILDINGS.items() %}
            <label for="cheat-building-{{ key }}">{{ definition.name }}{% if definition.get('lunar') %} — lunar{% endif %}
              <input id="cheat-building-{{ key }}" name="building_{{ key }}" type="number" min="0" max="1000" step="1" value="{{ cheat_state.levels.get(key,0) }}">
              <small>{{ definition.description }}</small>
            </label>
          {% endfor %}
        </div>
        </section>

        <section class="cheat-tab-panel" data-tab-panel data-tab-id="trampas-ciencia" data-tab-label="Ciencia" aria-labelledby="cheat-science-title">
        <h3 id="cheat-science-title">Investigaciones y tecnologías imperiales</h3>
        <div class="form-grid">
          {% for key, definition in TECHNOLOGIES.items() %}
            <label for="cheat-technology-{{ key }}">{{ definition.name }}
              <input id="cheat-technology-{{ key }}" name="technology_{{ key }}" type="number" min="0" max="1000" step="1" value="{{ cheat_state.technologies.get(key,0) }}">
              <small>{{ definition.description }}</small>
            </label>
          {% endfor %}
        </div>
        </section>

        <section class="cheat-tab-panel" data-tab-panel data-tab-id="trampas-unidades" data-tab-label="Naves y defensas" aria-labelledby="cheat-units-title">
        <h3 id="cheat-units-title">Naves, defensas y munición</h3>
        <h4>Naves</h4>
        <div class="form-grid">
          {% for key, definition in SHIPS.items() %}
            <label for="cheat-inventory-{{ key }}">{{ definition.name }}
              <input id="cheat-inventory-{{ key }}" name="inventory_{{ key }}" type="number" min="0" max="1000000000000" step="1" value="{{ cheat_state.inventory.get(key,0) }}">
            </label>
          {% endfor %}
        </div>
        <h4>Defensas y munición orbital</h4>
        <div class="form-grid">
          {% for key, definition in DEFENSES.items() %}
            <label for="cheat-inventory-{{ key }}">{{ definition.name }}
              <input id="cheat-inventory-{{ key }}" name="inventory_{{ key }}" type="number" min="0" max="1000000000000" step="1" value="{{ cheat_state.inventory.get(key,0) }}">
            </label>
          {% endfor %}
        </div>
        {% if cheat_state.custom_ships %}
          <h4>Diseños personalizados</h4>
          <div class="form-grid">
            {% for design in cheat_state.custom_ships %}
              <label for="cheat-custom-{{ design.id }}">{{ design.name }} — {{ design.role }}
                <input id="cheat-custom-{{ design.id }}" name="custom_{{ design.id }}" type="number" min="0" max="1000000000000" step="1" value="{{ design.quantity }}">
              </label>
            {% endfor %}
          </div>
        {% endif %}
        </section>

        <section class="cheat-tab-panel" data-tab-panel data-tab-id="trampas-especiales" data-tab-label="Recursos especiales" aria-labelledby="cheat-special-title">
        <h3 id="cheat-special-title">Recursos estratégicos y fragmentos de artefacto</h3>
        <h4>Recursos estratégicos</h4>
        <div class="form-grid">
          {% for key, definition in STRATEGIC_RESOURCES.items() %}
            <label for="cheat-strategic-{{ key }}">{{ definition.name }}
              <input id="cheat-strategic-{{ key }}" name="strategic_{{ key }}" type="number" min="0" max="1000000000000000" step="1" value="{{ cheat_state.strategic.get(key,0)|int }}">
              <small>{{ definition.description }}</small>
            </label>
          {% endfor %}
        </div>
        <h4>Fragmentos</h4>
        <div class="form-grid">
          {% for key, name in FRAGMENT_NAMES.items() %}
            <label for="cheat-fragment-{{ key }}">{{ name }}
              <input id="cheat-fragment-{{ key }}" name="fragment_{{ key }}" type="number" min="0" max="1000000000000" step="1" value="{{ cheat_state.fragments.get(key,0) }}">
            </label>
          {% endfor %}
        </div>
        </section>

        <section class="cheat-tab-panel" data-tab-panel data-tab-id="trampas-fuerzas" data-tab-label="Fuerzas y agricultura" aria-labelledby="cheat-forces-title">
        <h3 id="cheat-forces-title">Fuerzas terrestres, parámetros lunares y agricultura</h3>
        <h4>Guarnición terrestre</h4>
        <div class="form-grid">
          {% for field, definition in cheat_state.ground_fields.items() %}
            <label for="cheat-ground-{{ field }}">{{ definition[0] }}
              <input id="cheat-ground-{{ field }}" name="ground_{{ field }}" type="number" min="{{ definition[1] }}" max="{{ definition[2] }}" step="1" value="{{ cheat_state.ground[field]|int if cheat_state.ground and cheat_state.ground[field] is not none else (75 if field == 'morale' else 0) }}">
            </label>
          {% endfor %}
        </div>
        {% if cheat_state.moon %}
          <h4>Parámetros lunares</h4>
          <div class="form-grid">
            <label for="cheat-moon-diameter">Diámetro lunar
              <input id="cheat-moon-diameter" name="moon_diameter" type="number" min="1" max="1000000" value="{{ cheat_state.moon.diameter }}">
            </label>
            <label for="cheat-moon-fields">Campos lunares
              <input id="cheat-moon-fields" name="moon_fields_max" type="number" min="1" max="100000" value="{{ cheat_state.moon.fields_max }}">
            </label>
          </div>
        {% endif %}
        {% if cheat_state.farms %}
          <h4>Granjas</h4>
          {% for farm in cheat_state.farms %}
            <fieldset><legend>{{ farm.name }}</legend><div class="form-grid">
              <label for="cheat-farm-{{ farm.id }}-level">Nivel
                <input id="cheat-farm-{{ farm.id }}-level" name="farm_{{ farm.id }}_level" type="number" min="0" max="1000" value="{{ farm.level }}">
              </label>
              <label for="cheat-farm-{{ farm.id }}-workers">Trabajadores
                <input id="cheat-farm-{{ farm.id }}-workers" name="farm_{{ farm.id }}_workers" type="number" min="0" max="1000000000" value="{{ farm.workers }}">
              </label>
              <label for="cheat-farm-{{ farm.id }}-stored">Cosecha almacenada
                <input id="cheat-farm-{{ farm.id }}-stored" name="farm_{{ farm.id }}_stored" type="number" min="0" max="1000000000000000" value="{{ farm.stored|int }}">
              </label>
              <label for="cheat-farm-{{ farm.id }}-crop">Cultivo
                <select id="cheat-farm-{{ farm.id }}-crop" name="farm_{{ farm.id }}_crop">{% for key, crop in CROPS.items() %}<option value="{{ key }}" {% if farm.crop == key %}selected{% endif %}>{{ crop.name }}</option>{% endfor %}</select>
              </label>
              <label class="check-label"><input name="farm_{{ farm.id }}_automation" type="checkbox" value="1" {% if farm.automation %}checked{% endif %}> Automatización activa</label>
            </div></fieldset>
          {% endfor %}
        {% endif %}
        </section>
      </form>

      <section class="cheat-tab-panel" data-tab-panel data-tab-id="trampas-luna-artefactos" data-tab-label="Luna y artefactos" aria-labelledby="cheat-moon-artifacts-title">
        <h3 id="cheat-moon-artifacts-title">Crear o eliminar la luna y administrar artefactos</h3>
        <section aria-labelledby="cheat-moon-title">
          <h4 id="cheat-moon-title">Crear o eliminar la luna</h4>
          <p>Eliminar la luna también retira todos sus niveles de edificios lunares para evitar infraestructura invisible.</p>
          <form method="post" action="{{ url_for('cheat_moon_action_route') }}">
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
            {% if cheat_state.moon %}
              <input type="hidden" name="action" value="delete">
              <button class="button button-danger" type="submit">Eliminar {{ cheat_state.moon.name }}</button>
            {% else %}
              <input type="hidden" name="action" value="create">
              <button class="button" type="submit">Crear una luna de prueba</button>
            {% endif %}
          </form>
        </section>
        <section aria-labelledby="cheat-artifacts-title">
          <h4 id="cheat-artifacts-title">Editor de artefactos</h4>
          <form method="post" action="{{ url_for('cheat_artifact_action_route') }}" class="stacked-form">
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
            <input type="hidden" name="action" value="create">
            <label for="cheat-artifact-name">Nombre del artefacto <input id="cheat-artifact-name" name="name" maxlength="80" required></label>
            <label for="cheat-artifact-rarity">Rareza<select id="cheat-artifact-rarity" name="rarity">{% for key, label in cheat_state.rarities.items() %}<option value="{{ key }}">{{ label }}</option>{% endfor %}</select></label>
            <label for="cheat-artifact-effect">Efecto<select id="cheat-artifact-effect" name="effect_key">{% for key, label in ARTIFACT_EFFECTS.items() %}<option value="{{ key }}">{{ label }}</option>{% endfor %}</select></label>
            <label for="cheat-artifact-value">Potencia; 0,01 equivale a 1 %<input id="cheat-artifact-value" name="effect_value" type="number" min="0" max="100" step="0.001" value="0.01"></label>
            <label for="cheat-artifact-lore">Descripción o historia<textarea id="cheat-artifact-lore" name="lore" maxlength="500" rows="3"></textarea></label>
            <button class="button" type="submit">Crear artefacto</button>
          </form>
          {% if cheat_state.artifacts %}
            <div class="table-wrap"><table><caption>Artefactos existentes que puedes eliminar.</caption><thead><tr><th scope="col">Artefacto</th><th scope="col">Rareza</th><th scope="col">Efecto</th><th scope="col">Acción</th></tr></thead><tbody>
              {% for artifact in cheat_state.artifacts %}<tr><th scope="row">{{ artifact.name }}</th><td>{{ cheat_state.rarities.get(artifact.rarity,artifact.rarity) }}</td><td>{{ ARTIFACT_EFFECTS.get(artifact.effect_key,artifact.effect_key) }}: {{ (artifact.effect_value*100)|round(2) }} %</td><td><form method="post" action="{{ url_for('cheat_artifact_action_route') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="action" value="delete"><input type="hidden" name="artifact_id" value="{{ artifact.id }}"><button class="button button-danger" type="submit">Eliminar {{ artifact.name }}</button></form></td></tr>{% endfor %}
            </tbody></table></div>
          {% else %}<p>Todavía no hay artefactos.</p>{% endif %}
        </section>
      </section>
    </div>
    <div class="button-row">
      <button class="button button-primary" type="submit" form="cheat-progress-form">Guardar todos los cambios de progreso</button>
      <a class="button button-secondary" href="{{ url_for('game_view', section='settings', planet=planet.id, _anchor='cheat-mode-title') }}">Descartar valores escritos y recargar</a>
    </div>
  </section>
  {% endif %}
  </div>

  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-datos" data-tab-label="API, copias y salida">
  <section class="panel panel-wide" aria-labelledby="local-api-title"><p class="eyebrow">INTEGRACIÓN LOCAL OPCIONAL</p><h2 id="local-api-title">API de solo lectura</h2><p>Está desactivada por defecto. Crear un token temporal habilita únicamente los permisos seleccionados, solo en este equipo mediante <code>127.0.0.1</code>. La API versión 1 nunca construye, mueve flotas ni modifica la partida.</p>
    <form method="post" action="{{ url_for('api_token_action') }}" class="stacked-form"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><fieldset><legend>Permisos de lectura</legend><div class="form-grid"><label class="check-row"><input type="checkbox" name="scopes" value="estado"> Estado del universo</label><label class="check-row"><input type="checkbox" name="scopes" value="planetas"> Planetas, producción y reservas</label><label class="check-row"><input type="checkbox" name="scopes" value="flotas"> Flotas activas</label><label class="check-row"><input type="checkbox" name="scopes" value="calendario"> Calendario estratégico</label><label class="check-row"><input type="checkbox" name="scopes" value="informes"> Informes</label><label class="check-row"><input type="checkbox" name="scopes" value="estadisticas"> Estadísticas</label></div></fieldset><label>Duración en minutos<input name="minutes" type="number" min="5" max="1440" value="60"></label><button class="button button-primary" type="submit">Crear token temporal</button></form>
    {% if new_api_token %}<div class="notice notice-warning" role="status"><p><strong>Copia este token ahora; solo se muestra una vez.</strong></p><label>Token temporal<input value="{{ new_api_token }}" readonly spellcheck="false"></label></div>{% endif %}
    <p>Rutas disponibles: <code>/api/local/v1/estado</code>, <code>/api/local/v1/planetas</code>, <code>/api/local/v1/flotas</code>, <code>/api/local/v1/calendario</code>, <code>/api/local/v1/informes</code> y <code>/api/local/v1/estadisticas</code>. Envía el token como <code>Authorization: Bearer TOKEN</code>. Como alternativa sin API, usa las exportaciones CSV, JSON e ICS de cada pantalla.</p>
    {% if api_tokens %}<div class="table-wrap"><table><caption>Tokens creados; nunca se conserva el valor original, solo su huella criptográfica.</caption><thead><tr><th scope="col">Creado</th><th scope="col">Permisos</th><th scope="col">Caducidad</th><th scope="col">Estado</th><th scope="col">Acción</th></tr></thead><tbody>{% for token in api_tokens %}<tr><th scope="row">{{ token.created_at|date_label }}</th><td>{{ token.scopes_json|from_json|join(', ') }}</td><td>{{ token.expires_at|date_label }}</td><td>{{ 'Revocado' if token.revoked else 'Caducado' if token.expires_at <= now else 'Activo' }}</td><td>{% if not token.revoked and token.expires_at > now %}<form method="post" action="{{ url_for('api_revoke_action') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input type="hidden" name="token_id" value="{{ token.id }}"><button class="button button-danger" type="submit">Revocar</button></form>{% else %}Sin acceso{% endif %}</td></tr>{% endfor %}</tbody></table></div>{% endif %}
  </section>
  <section class="panel"><h2>Copia de seguridad protegida</h2><p>Crea otro <code>.dat</code> cifrado en <code>datos\copias_de_seguridad</code>. Esta opción sirve para recuperar la partida con el mismo perfil de Windows; para cambiar de ordenador utiliza el archivo <code>.eitransfer</code> del panel wxPython.</p><form method="post" action="{{ url_for('export_saves') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="button" type="submit">Crear y descargar copia local</button></form></section>
  <section class="panel danger-zone"><h2>Comenzar otro universo</h2><p>La partida actual se conserva y aparecerá en la lista de partidas guardadas.</p><form method="post" action="{{ url_for('abandon_action') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="button button-danger" type="submit">Salir y configurar otra partida</button></form></section>
  </div>
  {% else %}
  <div class="tab-panel-stack" data-tab-panel data-tab-id="configuracion-cuenta-servidor" data-tab-label="Cuenta y servidor">
    <section class="panel panel-wide" aria-labelledby="server-account-title">
      <p class="eyebrow">MODO SERVIDOR</p>
      <h2 id="server-account-title">Cuenta, soporte y universo administrado</h2>
      <p>Las trampas, las copias completas del servidor, la API local y la modificación de reglas globales no están disponibles para jugadores en línea.</p>
      <div class="button-row">
        <a class="button" href="{{ url_for('online_dashboard') }}">Volver a mis universos</a>
        <a class="button" href="{{ url_for('online_reports') }}">Enviar un reporte al equipo</a>
        <a class="button" href="{{ url_for('online_privacy') }}">Seguridad y privacidad</a>
        <a class="button" href="{{ url_for('online_store') }}">Tienda de este universo</a>
      </div>
    </section>
    <section class="panel">
      <h2>Renombrar planeta propio</h2>
      <form method="post" action="{{ url_for('settings_action') }}" class="stacked-form">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
        <input type="hidden" name="action" value="rename_planet">
        <label>Nuevo nombre<input name="planet_name" value="{{ planet.name }}" maxlength="40" required></label>
        <button class="button" type="submit">Guardar nombre</button>
      </form>
    </section>
    <section class="panel danger-zone">
      <h2>Salir del universo</h2>
      <p>Tu imperio se conserva. Regresarás a la lista de universos de tu cuenta.</p>
      <form method="post" action="{{ url_for('abandon_action') }}">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
        <button class="button" type="submit">Volver a mis universos</button>
      </form>
    </section>
  </div>
  {% endif %}
</div>
