import {
	getScriptArg,
} from "qrc:/js/lib/script_args";
import {
	createUpdatedSharedData,
} from "qrc:/js/lib/shared_data";
import {
	Feature,
} from "qrc:/js/lib/generated/enum";

import {
	AutomaticProcessConfig,
	convertLegacyAutomaticProcessConfig,
} from "qrc:/js/lib/graph_post_processing";
import {
	getKeysOfObject,
} from "qrc:/js/lib/utils";
import {
	readSetting,
} from "./gui_local_settings";
import {
	migrateInternalTables,
	populateInternalTables,
	populateSharedData as commonPopulateSharedData,
} from "./common_config";

export interface ScriptsSectionEntry {
	// Note: if the icon is unset there will be only a menu entry and no button.
	icon?: string;
	name: string;
	modulePath: string;
	functionName: string;
	shortcut?: string;
}

function erpExportButtonFromArgsIfAvailable(): ScriptsSectionEntry[] {
	const config = getScriptArg("erpExportConfig");
	if (config === undefined) {
		return [];
	}
	if (config.serverUrl === undefined && config.filePath === undefined) {
		return [];
	}
	return [
		{
			icon: "\ue545",
			name: wsi4.util.translate("erp_export"),
			modulePath: "src/gui_erp_export.js",
			functionName: "run",
		},
	];
}

function erpExportButtonsFromFeaturesIfAvailable(): ScriptsSectionEntry[] {
	const result: ScriptsSectionEntry[] = [];
	if (wsi4.isFeatureEnabled(Feature.erpInterfaceItBlech)) {
		if (wsi4.tables.permissions().write) {
			result.push({
				name: wsi4.util.translate("erp_export_settings"),
				modulePath: "opt/erp/it_blech_gui.js",
				functionName: "editItBlechConfig",
			});
		}
		result.push({
			icon: "\ue545",
			name: wsi4.util.translate("erp_export"),
			modulePath: "opt/erp/it_blech_gui.js",
			functionName: "run",
		});
	}
	return result;
}

function erpExportButtonsIfAvailable(): ScriptsSectionEntry[] {
	return [
		...erpExportButtonFromArgsIfAvailable(),
		...erpExportButtonsFromFeaturesIfAvailable(),
	];
}

function optButtonsIfAvailable(): ScriptsSectionEntry[] {
	const result: ScriptsSectionEntry[] = [];
	if (wsi4.isFeatureEnabled(Feature.httpServiceUnfold)) {
		result.push({
			icon: "\ue137",
			name: "Create unfold module output",
			modulePath: "opt/http_service/gui_export.js",
			functionName: "createUnfoldOutput",
		});
	}
	if (wsi4.isFeatureEnabled(Feature.httpServiceNestor)) {
		result.push({
			icon: "\ue137",
			name: "Create nestor module output",
			modulePath: "opt/http_service/gui_export.js",
			functionName: "createNestorOutput",
		});
	}
	if (wsi4.isFeatureEnabled(Feature.httpServiceAssemblyTree)) {
		result.push({
			icon: "\ue137",
			name: "Create assembly tree module output",
			modulePath: "opt/http_service/gui_export.js",
			functionName: "createAssemblyTreeOutput",
		});
	}
	return result;
}

function tableIoIfAvailable(): ScriptsSectionEntry[] {
	if (!wsi4.tables.permissions().write) {
		return [];
	}

	return [
		{
			name: wsi4.util.translate("tables_save_to_file"),
			modulePath: "src/gui_table_io.js",
			functionName: "exportTablesToFile",
		},
		{
			name: wsi4.util.translate("tables_load_from_file"),
			modulePath: "src/gui_table_io.js",
			functionName: "importTablesFromFile",
		},
		{
			name: wsi4.util.translate("table_import_json_files"),
			modulePath: "src/gui_table_io.js",
			functionName: "importJsonTables",
		},
		{
			name: wsi4.util.translate("table_import_from_server"),
			modulePath: "src/gui_table_io.js",
			functionName: "importTablesFromHttpServer",
		},
		{
			name: wsi4.util.translate("table_import_csv_files"),
			modulePath: "src/gui_table_io.js",
			functionName: "importCsvTables",
		},
		{
			name: wsi4.util.translate("export_table") + " (JSON)",
			modulePath: "src/gui_table_io.js",
			functionName: "exportJsonTable",
		},
		{
			name: wsi4.util.translate("export_all_tables") + " (JSON)",
			modulePath: "src/gui_table_io.js",
			functionName: "exportJsonTables",
		},
		{
			name: wsi4.util.translate("export_table") + " (CSV)",
			modulePath: "src/gui_table_io.js",
			functionName: "exportCsvTable",
		},
		{
			name: wsi4.util.translate("export_all_tables") + " (CSV)",
			modulePath: "src/gui_table_io.js",
			functionName: "exportCsvTables",
		},
	];
}

export function createScriptsSection(): Array<ScriptsSectionEntry> {
	return [
		{
			icon: "\ue354",
			name: wsi4.util.translate("shorten_article_names"),
			modulePath: "src/gui_internal.js",
			functionName: "showArticleNameElisionDialog",
		},
		{
			icon: "\ue220",
			name: wsi4.util.translate("edit_calculation_settings"),
			modulePath: "src/gui_internal.js",
			functionName: "showCalcSettingsDialog",
		},
		{
			icon: "\ue005",
			name: wsi4.util.translate("edit_export_settings"),
			modulePath: "src/gui_internal.js",
			functionName: "showExportSettingsDialog",
			shortcut: "Shift+Ctrl+E",
		},
		{
			icon: "\ue400",
			name: wsi4.util.translate("Export"),
			modulePath: "src/gui_export.js",
			functionName: "runGuiExport",
			shortcut: "Ctrl+E",
		},
		...erpExportButtonsIfAvailable(),
		...optButtonsIfAvailable(),
		{
			name: wsi4.util.translate("set_default_values"),
			modulePath: "src/gui_internal.js",
			functionName: "showNodeUserDataDefaultValuesDialog",
		},
		{
			name: wsi4.util.translate("edit_bend_line_engraving_settings"),
			modulePath: "src/gui_internal.js",
			functionName: "showBendLineEngravingConfigDialog",
		},
		{
			name: wsi4.util.translate("edit_automatic_processes"),
			modulePath: "src/gui_internal.js",
			functionName: "editAutomaticProcessConfig",
		},
		...tableIoIfAvailable(),
		{
			name: wsi4.util.translate("create_l_profile"),
			modulePath: "src/gui_internal.js",
			functionName: "createLProfilePart",
		},
		{
			name: wsi4.util.translate("create_tube") + " (experimental)",
			modulePath: "src/gui_internal.js",
			functionName: "createTube",
		},
	];
}

function loadAutomaticProcessConfig(): AutomaticProcessConfig {
	const currentConfig = readSetting("automaticProcessConfig");
	if (getKeysOfObject(currentConfig).length > 0) {
		return currentConfig;
	} else {
		return convertLegacyAutomaticProcessConfig(readSetting("legacyAutomaticProcessConfig"));
	}
}

function guiPopulateSharedData(): void {
	let obj: StringIndexedInterface = {};
	obj = createUpdatedSharedData(
		"sheetMergingEnabled",
		readSetting("sheetMergingEnabled"),
		obj,
	);
	obj = createUpdatedSharedData(
		"automaticProcessConfig",
		loadAutomaticProcessConfig(),
		obj,
	);
	obj = createUpdatedSharedData(
		"defaultSheetMaterialId",
		readSetting("defaultSheetMaterialId"),
		obj,
	);
	obj = createUpdatedSharedData(
		"defaultBendLineEngravingMode",
		readSetting("defaultBendLineEngravingMode"),
		obj,
	);
	obj = createUpdatedSharedData(
		"bendLineEngravingLength",
		readSetting("bendLineEngravingLength"),
		obj,
	);
	wsi4.sharedData.write(obj);
}

export interface GuiConfig {
	scripts: ScriptsSectionEntry[];
}

export function run(): GuiConfig {
	populateInternalTables();
	commonPopulateSharedData();
	guiPopulateSharedData();
	migrateInternalTables();
	wsi4.tables.commit();

	// Set gui history limit to no limit
	wsi4.graphManipulator.setMaxHistorySize(0);

	return {
		scripts: createScriptsSection(),
	};
}
