import { system } from "@minecraft/server";
import {
  ActionFormData,
  ModalFormData,
} from "@minecraft/server-ui";
import {
  SETTINGS,
  getDynamicLightSetting,
  saveSetting,
  settingDisplayValue,
  settingOptionIndex,
} from "./settings.js";
import { cleanupAllDynamicLights } from "./light_engine.js";
import { syncAllPlayerInventories } from "./inventory_sync.js";
import {
  combineRawText,
  translate,
} from "./localization.js";

export async function openDynamicLightMenu(player) {
  try {
    const response = await new ActionFormData()
      .title(translate("system_dynamic_light.ui.main.title"))
      .body(translate("system_dynamic_light.ui.main.body"))
      .button(translate("system_dynamic_light.ui.main.settings"))
      .button(translate("system_dynamic_light.ui.main.information"))
      .button(translate("system_dynamic_light.ui.close"))
      .show(player);

    if (response.canceled) return;

    if (response.selection === 0) {
      system.run(() => openSettingsForm(player));
    } else if (response.selection === 1) {
      system.run(() => openInformationForm(player));
    }
  } catch (error) {
    console.warn(`[System Dynamic Light] Main form error: ${error}`);
  }
}

async function openSettingsForm(player) {
  try {
    const form = new ModalFormData().title(
      translate("system_dynamic_light.ui.settings.title")
    );

    for (const setting of SETTINGS) {
      const current = getDynamicLightSetting(setting.id);

      if (setting.type === "toggle") {
        form.toggle(setting.name, Boolean(current));
      } else {
        form.dropdown(
          setting.name,
          setting.options.map((option) => option.label),
          settingOptionIndex(setting, current)
        );
      }
    }

    const response = await form.show(player);

    if (response.canceled || !response.formValues) {
      system.run(() => openDynamicLightMenu(player));
      return;
    }

    for (let index = 0; index < SETTINGS.length; index++) {
      const setting = SETTINGS[index];
      const formValue = response.formValues[index];

      if (setting.type === "toggle") {
        if (typeof formValue === "boolean") {
          saveSetting(setting.id, formValue);
        }
        continue;
      }

      if (typeof formValue === "number") {
        const option = setting.options[formValue];
        if (option) saveSetting(setting.id, option.value);
      }
    }

    cleanupAllDynamicLights();
    syncAllPlayerInventories();

    player.sendMessage(
      translate("system_dynamic_light.message.settings_saved")
    );

    system.run(() => openDynamicLightMenu(player));
  } catch (error) {
    console.warn(`[System Dynamic Light] Settings form error: ${error}`);
  }
}

async function openInformationForm(player) {
  try {
    const form = new ActionFormData()
      .title(translate("system_dynamic_light.ui.information.title"))
      .body(translate("system_dynamic_light.ui.information.body"));

    for (const setting of SETTINGS) {
      form.button(
        combineRawText(
          setting.name,
          "\n§r",
          settingDisplayValue(setting)
        )
      );
    }

    form.button(translate("system_dynamic_light.ui.back"));

    const response = await form.show(player);
    if (response.canceled) return;

    if (response.selection === SETTINGS.length) {
      system.run(() => openDynamicLightMenu(player));
      return;
    }

    const setting = SETTINGS[response.selection];
    if (setting) {
      system.run(() => openSettingInformation(player, setting));
    }
  } catch (error) {
    console.warn(`[System Dynamic Light] Information form error: ${error}`);
  }
}

async function openSettingInformation(player, setting) {
  try {
    const response = await new ActionFormData()
      .title(combineRawText("§l§9", setting.name))
      .body(
        combineRawText(
          setting.description,
          "\n\n",
          translate("system_dynamic_light.ui.current_setting"),
          " ",
          settingDisplayValue(setting)
        )
      )
      .button(translate("system_dynamic_light.ui.back"))
      .button(translate("system_dynamic_light.ui.main_menu"))
      .show(player);

    if (response.canceled) return;

    if (response.selection === 0) {
      system.run(() => openInformationForm(player));
    } else if (response.selection === 1) {
      system.run(() => openDynamicLightMenu(player));
    }
  } catch (error) {
    console.warn(
      `[System Dynamic Light] Option information error: ${error}`
    );
  }
}
