// ---- 05_guardian_settings_panel.js ----
// guardian_system source chunk
// Original lines: 4170-4653

// - Configurações do mundo: travam após salvar (reset apenas no Criativo)
// ============================================================================

const TAG_UI_SIMPLE = CG.tags.uiSimple;
const TAG_TEXT_MESSAGES_OFF = "lwj_texts_off";
const TAG_TEXT_MESSAGES_ON = "lwj_texts_on";

function _rmTranslate(key, withArgs) {
  const msg = { translate: key };
  if (withArgs !== undefined) msg.with = withArgs;
  return msg;
}
function _rmText(text) {
  return { text: String(text ?? "") };
}
function _rmPush(raw, ...parts) {
  if (!raw || !Array.isArray(raw.rawtext)) return raw;
  for (const part of parts) {
    if (part === null || part === undefined) continue;
    if (Array.isArray(part)) {
      for (const sub of part) _rmPush(raw, sub);
      continue;
    }
    raw.rawtext.push(typeof part === "string" ? _rmText(part) : part);
  }
  return raw;
}
function _rmJoin(...parts) {
  const raw = { rawtext: [] };
  return _rmPush(raw, ...parts);
}
function _stateLabelRaw(enabled) {
  return _rmTranslate(enabled ? "lwj.ui.common.enabled" : "lwj.ui.common.disabled");
}
function _yesNoLabelRaw(yes) {
  return _rmTranslate(yes ? "lwj.ui.common.yes" : "lwj.ui.common.no");
}
function _dayLenLabelRaw(mode) {
  return _rmTranslate(mode === 0 ? "lwj.ui.settings.world.day_normal" : "lwj.ui.settings.world.day_25");
}
function _blocksCountRaw(value) {
  return _rmTranslate("lwj.ui.common.blocks_count", [String(value)]);
}
function _worldEnchantingLabelRaw() {
  return _rmTranslate("lwj.ui.settings.world.enchanting_default");
}

function _dynamicLightEnabled() {
  return rjWorldCfgGet("mod_light", 1) === 1;
}

function _dynamicLightLabelRaw() {
  return _stateLabelRaw(_dynamicLightEnabled());
}

function uiSimple(player) {
  // Opção de desativar ícones removida: a UI sempre usa ícones quando disponíveis.
  return false;
}
function setUiSimple(player, simple) {
  // Migrado para configurações do pacote.
}

function _removeTagsWithPrefix(entity, prefix) {
  try {
    const tags = entity?.getTags?.() ?? [];
    for (const t of tags) {
      if (typeof t === "string" && t.startsWith(prefix)) {
        try { entity.removeTag(t); } catch (e) {}
      }
    }
  } catch (e) {}
}

function textMessagesEnabled(player) {
  try {
    if (player?.hasTag?.(TAG_TEXT_MESSAGES_OFF)) return false;
    // Default: disabled. The player must opt in from the Personal settings panel.
    return !!player?.hasTag?.(TAG_TEXT_MESSAGES_ON);
  } catch (e) {
    return false;
  }
}
function setTextMessagesEnabled(player, enabled) {
  try {
    if (enabled) {
      player?.removeTag?.(TAG_TEXT_MESSAGES_OFF);
      player?.addTag?.(TAG_TEXT_MESSAGES_ON);
      return true;
    }
    player?.removeTag?.(TAG_TEXT_MESSAGES_ON);
    player?.addTag?.(TAG_TEXT_MESSAGES_OFF);
    return false;
  } catch (e) {
    return !!enabled;
  }
}

function _addBtn(form, player, text, icon) {
  try {
    if (uiSimple(player) || !icon) return form.button(text);
    return form.button(text, icon);
  } catch (e) {
    try { return form.button(text); } catch (e2) {}
  }
}
function _addHeader(form, text) {
  try { form.header(text); } catch (e) {}
  return form;
}
function _addDivider(form) {
  try { form.divider(); } catch (e) {}
  return form;
}

function buildConfigSummary(player) {
  const raw = { rawtext: [] };
  const dayMode = getDayLenMode();

  _rmPush(raw,
    _rmTranslate("lwj.ui.settings.summary.status_header"), "\n",
    "• ", _rmTranslate("lwj.ui.settings.summary.effect"), ": ", _stateLabelRaw(efeitosAtivos(player)), "\n",
    "• ", _rmTranslate("lwj.ui.settings.summary.particles"), ": ", _stateLabelRaw(particulasAtivas(player)), "\n",
    "\n",
    _rmTranslate("lwj.ui.settings.summary.world_header"), "\n",
    "• ", _rmTranslate("lwj.ui.settings.summary.explosions"), ": ", _yesNoLabelRaw(!mobGriefBloqueado()), "\n",
    "• ", _rmTranslate("lwj.ui.settings.summary.day_night"), ": ", _dayLenLabelRaw(dayMode), "\n",
    "• ", _rmTranslate("lwj.ui.settings.summary.dynamic_light"), ": ", _dynamicLightLabelRaw(), "\n",
    "• ", _rmTranslate("lwj.ui.settings.summary.class_restrictions"), ": ", _rmTranslate("lwj.ui.common.enabled"), "\n",
    "• ", _rmTranslate("lwj.ui.settings.summary.enchanting"), ": ", _worldEnchantingLabelRaw(), "\n"
  );

  if (worldSettingsLocked()) _rmPush(raw, _rmTranslate("lwj.ui.settings.summary.world_locked"));
  else _rmPush(raw, _rmTranslate("lwj.ui.settings.summary.world_lock_warning"));

  return raw;
}

function abrirConfiguracoes(player, onDone) {
  return abrirPainelGuardiao(player, onDone);
}

function abrirConfigItem(player) {
  abrirPainelGuardiao(player);
}

function abrirPainelGuardiao(player, onDone) {
  ensurePlayerConfigDataVersion(player);

  const wLocked = worldSettingsLocked();
  const worldBlocked = wLocked && !isCreative(player);
  const prefLine = _rmJoin(
    "§7",
    _rmTranslate("lwj.ui.settings.summary.effect"), ": ", _stateLabelRaw(efeitosAtivos(player)),
    "  •  ",
    _rmTranslate("lwj.ui.settings.summary.particles"), ": ", _stateLabelRaw(particulasAtivas(player)),

  );
  const worldLine = _rmJoin(
    "§7",
    _rmTranslate("lwj.ui.settings.summary.dynamic_light"), ": ", _dynamicLightLabelRaw(),
    worldBlocked ? _rmJoin("  •  §c", _rmTranslate("lwj.ui.settings.main.sealed_short"), "§7") : ""
  );

  const f = new ActionFormData();
  f.title(_rmJoin("§6⚙ §r", _rmTranslate("lwj.ui.settings.main.title")));
  f.body(_rmJoin(
    _rmTranslate("lwj.ui.settings.main.choose"), "\n",
    "§7", _rmTranslate(wLocked ? "lwj.ui.settings.main.note_locked" : "lwj.ui.settings.main.note_unlock")
  ));

  _addBtn(f, player, _rmJoin(_rmTranslate("lwj.ui.settings.main.btn_personal"), "\n", prefLine), "textures/lorewarden/ui/guardian_settings");
  _addBtn(
    f,
    player,
    _rmJoin(_rmTranslate(worldBlocked ? "lwj.ui.settings.main.btn_world_locked" : "lwj.ui.settings.main.btn_world"), "\n", worldLine),
    "textures/lorewarden/ui/guardian_classes"
  );
  _addDivider(f);
  _addBtn(f, player, _rmTranslate("lwj.ui.common.close"), "textures/lorewarden/ui/guardian_close");

  return _showFormSafe(f, player).then((res) => {
    if (res?.canceled) return onDone?.();

    if (res.selection === 0) return abrirPainelPessoais(player, () => abrirPainelGuardiao(player, onDone));
    if (res.selection === 1) {
      if (worldBlocked) {
        const b = new ActionFormData();
        b.title(_rmTranslate("lwj.ui.settings.world.title_locked"));
        b.body(_rmTranslate("lwj.ui.settings.world.locked_body"));
        b.button(_rmTranslate("lwj.ui.common.back"));
        return _showFormSafe(b, player).then(() => abrirPainelGuardiao(player, onDone));
      }
      return abrirPainelMundo(player, () => abrirPainelGuardiao(player, onDone));
    }

    return onDone?.();
  });
}

function abrirPainelPessoais(player, onBack) {
  const form = new ModalFormData();
  form.title(_rmTranslate("lwj.ui.settings.personal.title"));

  form.toggle(_rmTranslate("lwj.ui.settings.personal.reward_effect"), { defaultValue: efeitosAtivos(player) });
  form.toggle(_rmTranslate("lwj.ui.settings.personal.effect_particles"), { defaultValue: particulasAtivas(player) });
  form.toggle(_rmTranslate("lwj.ui.settings.personal.show_messages"), { defaultValue: textMessagesEnabled(player) });

  const classEffects = getClassRewardEffectsForPlayer(player);
  const editableClassEffects = [];

  for (const eff of classEffects) {
    const amp = eff.amp ?? 0;
    const unlocked = !!player?.hasTag?.(efeitoTag(eff.id, amp));
    if (!unlocked) continue;
    editableClassEffects.push(eff);
    form.toggle(_rmJoin("🧬 ", classRewardEffectNameRaw(eff)), { defaultValue: isSavedEffectEnabled(player, eff.id, amp) });
  }

  return _showFormSafe(form, player).then((res) => {
    if (res?.canceled) return onBack?.();

    const v = res.formValues ?? [];
    const effOn = v[0] === true;
    const particlesOn = v[1] === true;
    const showMessages = v[2] === true;

    setEfeitosAtivos(player, effOn);
    setParticulasAtivas(player, particlesOn);
    setTextMessagesEnabled(player, showMessages);

    for (let i = 0; i < editableClassEffects.length; i++) {
      const eff = editableClassEffects[i];
      const enabled = v[3 + i] === true;
      setSavedEffectEnabled(player, eff.id, eff.amp ?? 0, enabled);
    }

    try {
      if (effOn) void aplicarEfeitosSalvos(player);
      else void removerEfeitosSalvos(player);
    } catch (e) {}

    try { __LWJ_MUTE_MESSAGE__(player, _rmTranslate("lwj.ui.settings.personal.saved")); } catch (e) {}
    return onBack?.();
  }).catch((e) => { rjDebugWarn("guardian_system:settings.personal", "Personal settings form callback failed.", e); onBack?.(); });
}



function abrirPainelEfeitosClasseConfig(player, onBack) {
  if (!efeitosAtivos(player)) {
    try { __LWJ_MUTE_MESSAGE__(player, _rmTranslate("lwj.ui.settings.personal.class_effects_need_main")); } catch (e) {}
    return onBack?.();
  }

  const list = getClassRewardEffectsForPlayer(player);
  if (!list.length) {
    try { __LWJ_MUTE_MESSAGE__(player, _rmTranslate("lwj.ui.settings.personal.class_effects_empty")); } catch (e) {}
    return onBack?.();
  }

  const f = new ActionFormData();
  f.title(_rmJoin("§6⚙ §r", _rmTranslate("lwj.ui.settings.personal.class_effects_title")));
  f.body(_rmJoin(buildClassEffectToggleSummaryRaw(player).rawtext, "\n§8────────────────§r"));
  _addHeader(f, _rmJoin("§b• §r", _rmTranslate("lwj.ui.settings.personal.class_effects_title")));
  _addDivider(f);

  for (const eff of list) {
    const unlocked = !!player?.hasTag?.(efeitoTag(eff.id, eff.amp ?? 0));
    const enabled = unlocked && isSavedEffectEnabled(player, eff.id, eff.amp ?? 0);
    const nameRaw = classRewardEffectNameRaw(eff);
    const stateText = !unlocked
      ? _rmTranslate("lwj.ui.settings.personal.effect_state_locked")
      : (enabled ? _rmTranslate("lwj.ui.settings.personal.effect_state_enabled") : _rmTranslate("lwj.ui.settings.personal.effect_state_disabled"));
    const prefix = !unlocked ? "🔒" : (enabled ? "✅" : "⛔");
    _addBtn(f, player, _rmJoin(prefix, " ", nameRaw, "\n§7", stateText), "textures/lorewarden/ui/guardian_book");
  }
  _addBtn(f, player, _rmTranslate("lwj.ui.common.back"), "textures/lorewarden/ui/guardian_back");

  return _showFormSafe(f, player).then((res) => {
    if (res?.canceled) return onBack?.();
    if (res.selection === undefined || res.selection === null) return onBack?.();
    if (res.selection >= list.length) return onBack?.();

    const eff = list[res.selection];
    const unlocked = !!player?.hasTag?.(efeitoTag(eff.id, eff.amp ?? 0));
    if (!unlocked) {
      try { __LWJ_MUTE_MESSAGE__(player, _rmJoin("§c", _rmTranslate("lwj.ui.settings.personal.effect_unlock_prefix"), " ", nameRaw, " ", _rmTranslate("lwj.ui.settings.personal.effect_unlock_suffix"))); } catch (e) {}
      return system.run(() => abrirPainelEfeitosClasseConfig(player, onBack));
    }

    return Promise.resolve(toggleClassRewardEffectForPlayer(player, eff)).then((nextEnabled) => {
      if (nextEnabled === null) return;
      try {
        __LWJ_MUTE_MESSAGE__(player, nextEnabled
          ? _rmJoin("§a", nameRaw, " ", _rmTranslate("lwj.ui.settings.personal.effect_enabled_suffix"))
          : _rmJoin("§e", nameRaw, " ", _rmTranslate("lwj.ui.settings.personal.effect_disabled_suffix")));
      } catch (e) {}
      return system.run(() => abrirPainelEfeitosClasseConfig(player, onBack));
    });
  }).catch((e) => { rjDebugWarn("guardian_system:settings.guardian", "Guardian settings form callback failed.", e); onBack?.(); });
}

function _worldSummaryOnly(player) {
  const raw = { rawtext: [] };
  const mode = getDayLenMode();
  _rmPush(raw,
    _rmTranslate("lwj.ui.settings.world.block_protection"), ": ", _stateLabelRaw(mobGriefBloqueado()), "\n",
    _rmTranslate("lwj.ui.settings.summary.day_night"), ": ", _dayLenLabelRaw(mode), "\n",
    _rmTranslate("lwj.ui.settings.summary.dynamic_light"), ": ", _dynamicLightLabelRaw(), "\n",
    _rmTranslate("lwj.ui.settings.summary.class_restrictions"), ": ", _rmTranslate("lwj.ui.common.enabled"), "\n",
    _rmTranslate("lwj.ui.settings.world.enchanting_table"), ": ", _worldEnchantingLabelRaw()
  );
  return raw;
}


function abrirPainelMundo(player, onBack) {
  const wLocked = worldSettingsLocked();
  const criativo = isCreative(player);

  if (wLocked && !criativo) {
    const f = new ActionFormData();
    f.title(_rmTranslate("lwj.ui.settings.world.title_locked"));
    f.body(_rmTranslate("lwj.ui.settings.world.locked_body"));
    f.button(_rmTranslate("lwj.ui.common.back"));
    return _showFormSafe(f, player).then(() => onBack?.());
  }

  if (wLocked) {
    const f = new ActionFormData();
    f.title(_rmTranslate("lwj.ui.settings.world.title_locked"));
    f.body(_rmJoin(
      _rmTranslate("lwj.ui.settings.world.locked_body_with_summary"), "\n\n",
      _worldSummaryOnly(player).rawtext,
    ));
    f.button(_rmTranslate("lwj.ui.common.back"));

    const canReset = isCreative(player);
    if (canReset) f.button(_rmTranslate("lwj.ui.settings.world.reset_btn"));

    return _showFormSafe(f, player).then((res) => {
      if (res?.canceled) return onBack?.();
      if (canReset && res.selection === 1) return confirmResetWorldOnly(player, onBack);
      return onBack?.();
    });
  }

  const form = new ModalFormData();
  form.title(_rmTranslate("lwj.ui.settings.world.title"));

  form.toggle(_rmTranslate("lwj.ui.settings.world.explosion_toggle"), { defaultValue: mobGriefBloqueado() });
  form.toggle(_rmTranslate("lwj.ui.settings.world.dynamic_light_toggle"), { defaultValue: _dynamicLightEnabled() });
  const dayMode = getDayLenMode();
  const dayOptions = [_rmTranslate("lwj.ui.settings.world.day_normal"), _rmTranslate("lwj.ui.settings.world.day_25_default")];
  const allowed = [0,1];
  const defIdx = Math.max(0, allowed.indexOf((dayMode===0||dayMode===1)?dayMode:1));
  form.dropdown(_rmTranslate("lwj.ui.settings.world.day_length"), dayOptions, { defaultValueIndex: defIdx });

  return _showFormSafe(form, player).then((res) => {
    if (res?.canceled) return onBack?.();

    const v = res.formValues ?? [];
    const novoMob = v[0] === true;
    const novaLuzDinamica = v[1] === true;

    const idxDay = (typeof v[2] === "number") ? (v[2] | 0) : defIdx;
    const novoDay = allowed[idxDay] ?? 1;

    const c = new ActionFormData();
    c.title(_rmTranslate("lwj.ui.settings.world.confirm_title"));
    c.body(_rmJoin(
      "§l", _rmTranslate("lwj.ui.settings.world.title"), "§r\n",
      "• ", _rmTranslate("lwj.ui.settings.world.block_protection"), ": ", _stateLabelRaw(novoMob), "\n",
      "• ", _rmTranslate("lwj.ui.settings.world.dynamic_light_toggle"), ": ", _stateLabelRaw(novaLuzDinamica), "\n",
      "• ", _rmTranslate("lwj.ui.settings.summary.day_night"), ": ", _rmTranslate(novoDay === 0 ? "lwj.ui.settings.world.day_normal" : "lwj.ui.settings.world.day_25_default"), "\n",
      "• ", _rmTranslate("lwj.ui.settings.summary.class_restrictions"), ": ", _rmTranslate("lwj.ui.common.enabled"), "\n",
      "• ", _rmTranslate("lwj.ui.settings.world.enchanting_table"), ": ", _worldEnchantingLabelRaw(), "\n\n",
      _rmTranslate("lwj.ui.settings.world.confirm_lock_warning")
    ));
    c.button(_rmTranslate("lwj.ui.settings.world.confirm_lock"));
    c.button(_rmTranslate("lwj.ui.common.back"));

    return _showFormSafe(c, player).then((r2) => {
      if (r2?.canceled || r2.selection === 1) return abrirPainelMundo(player, onBack);

      cfgSet(CFG_MOBGRIEF, novoMob ? 1 : 0);
      rjWorldCfgSet("mod_light", novaLuzDinamica ? 1 : 0);
      setDayLenMode((novoDay === 0 || novoDay === 1) ? novoDay : 1);

      lockWorldSettings();

      try { __LWJ_MUTE_MESSAGE__(player, _rmTranslate("lwj.ui.settings.world.saved_locked")); } catch (e) {}
      return onBack?.();
    });
  }).catch(() => onBack?.());
}


// Reset atualizado para incluir preferências e encantamento
function _resetConfigItemPlayer(player) {
  try { player?.removeTag?.(TAG_EFEITO_OFF); } catch (e) {}
  try { player?.removeTag?.(TAG_EFEITO_NO_PARTICLES); } catch (e) {}
  try { player?.removeTag?.(TAG_PARTICLES_PREF_SET); } catch (e) {}
  try { player?.removeTag?.(TAG_UI_SIMPLE); } catch (e) {}
  try { player?.removeTag?.(TAG_TEXT_MESSAGES_ON); } catch (e) {}
  try { player?.addTag?.(TAG_TEXT_MESSAGES_OFF); } catch (e) {}
  _removeTagsWithPrefix(player, TAG_FOLLOW_DIST_PREFIX_PLAYER);

  // Defaults do addon: partículas DESLIGADAS, mensagens de chat DESLIGADAS, efeito ATIVADO, UI completa, follow=10
  try { player?.addTag?.(TAG_EFEITO_NO_PARTICLES); } catch (e) {}
  try { player?.addTag?.(TAG_PARTICLES_PREF_SET); } catch (e) {}

  try {
    if (efeitosAtivos(player)) void aplicarEfeitosSalvos(player);
    else void removerEfeitosSalvos(player);
  } catch (e) {}
}

function _resetConfigWorld() {
  try {
    cfgSet(CFG_SETTINGS_LOCKED, 0);
    cfgSet(CFG_MOBGRIEF, 1);
    setDayLenMode(1);
  } catch (e) {}
}
// Export para abrir o painel de Mundo a partir de outros scripts (ex.: Etiqueta vanilla)

// Export para abrir o Painel do Guardião (Configurações -> Pessoais/Guardião/Mundo) a partir de outros scripts (ex.: scriptevent/debug fallback)
export function lwj_open_settings_panel(player) {
  try {
    if (!player) return undefined;
    return abrirPainelGuardiao(player);
  } catch (e) {
    try { rjDebugWarn("guardian_system:settings.export", "Failed to open Guardian settings panel.", e); } catch (e2) {}
    return undefined;
  }
}

export function lwj_open_world_settings(player) {
  try {
    if (!player) return undefined;
    return abrirPainelMundo(player);
  } catch (e) {
    try { rjDebugWarn("guardian_system:settings.export", "Failed to open world settings panel.", e); } catch (e2) {}
    return undefined;
  }
}

