import {
	getScriptArg,
} from "qrc:/js/lib/script_args";
import {
	createUpdatedSharedData,
	sharedDataEntryPopulated,
} 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 {
	getSettingOrDefault,
} from "qrc:/js/lib/settings_table";
import {
	readSetting,
} from "./gui_local_settings";
import {
	migrateInternalTables,
	populateInternalTables,
	populateSharedData as commonPopulateSharedData,
} from "./common_config";

type ScriptsSectionEntry = PrivateMainWindowScriptAction;

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",
			menuType: "fileExport",
		},
	];
}

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

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

function optButtonsIfAvailable(): ScriptsSectionEntry[] {
	const result: ScriptsSectionEntry[] = [];
	if (wsi4.isFeatureEnabled(Feature.quotationExport)) {
		result.push({
			// FIXME #2557
			icon: "\ue037",
			name: wsi4.util.translate("export_and_open_quotation"),
			modulePath: "src/gui_internal.js",
			functionName: "exportAndOpenQuotation",
			menuType: "fileExport",
		});
	}
	if (wsi4.isFeatureEnabled(Feature.httpServiceUnfold)) {
		result.push({
			name: "Create unfold module output",
			modulePath: "opt/http_service/gui_export.js",
			functionName: "createUnfoldOutput",
			menuType: "fileExport",
		});
	}
	if (wsi4.isFeatureEnabled(Feature.httpServiceNestor)) {
		result.push({
			name: "Create nestor module output",
			modulePath: "opt/http_service/gui_export.js",
			functionName: "createNestorOutput",
			menuType: "fileExport",
		});
	}
	if (wsi4.isFeatureEnabled(Feature.httpServiceAssemblyTree)) {
		result.push({
			name: "Create assembly tree module output",
			modulePath: "opt/http_service/gui_export.js",
			functionName: "createAssemblyTreeOutput",
			menuType: "fileExport",
		});
	}
	if (wsi4.isFeatureEnabled(Feature.httpServiceClassifier)) {
		result.push({
			name: "Create classification module output",
			modulePath: "opt/http_service/gui_export.js",
			functionName: "createClassificationOutput",
		});
	}
	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("project_export_settings"),
			modulePath: "src/gui_internal.js",
			functionName: "showExportSettingsDialog",
			shortcut: "Shift+Ctrl+E",
			menuType: "fileExport",
		},
		{
			icon: "\ue400",
			name: wsi4.util.translate("project_export"),
			modulePath: "src/gui_export.js",
			functionName: "runGuiExport",
			shortcut: "Ctrl+E",
			menuType: "fileExport",
		},
		...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",
		},
		{
			name: wsi4.util.translate("set_quotation_template_path"),
			modulePath: "src/gui_internal.js",
			functionName: "showQuotationFilePathDialog",
		},
		{
			name: wsi4.util.translate("set_job_card_template_path"),
			modulePath: "src/gui_internal.js",
			functionName: "showJobCardFilePathDialog",
		},
		{
			name: wsi4.util.translate("set_bend_drawing_template_path"),
			modulePath: "src/gui_internal.js",
			functionName: "showBendDrawingFilePathDialog",
		},
		{
			name: wsi4.util.translate("export_default_docx_templates"),
			modulePath: "src/gui_internal.js",
			functionName: "exportDefaultDocXTemplates",
		},
	];
}

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

function guiPopulateSharedData(): void {
	let obj = wsi4.sharedData.read();

	if (!sharedDataEntryPopulated("sheetMergingEnabled", obj)) {
		const mode = getSettingOrDefault("sheetNestingMode");
		if (mode === "clientDecision") {
			obj = createUpdatedSharedData(
				"sheetMergingEnabled",
				readSetting("sheetMergingEnabled"),
				obj,
			);
		}
	}

	obj = createUpdatedSharedData(
		"automaticProcessConfig",
		loadAutomaticProcessConfig(),
		obj,
	);
	obj = createUpdatedSharedData(
		"defaultBendLineEngravingMode",
		readSetting("defaultBendLineEngravingMode"),
		obj,
	);
	obj = createUpdatedSharedData(
		"bendLineEngravingLength",
		readSetting("bendLineEngravingLength"),
		obj,
	);
	if (readSetting("initialUserDataValueMode") === "static") {
		obj = createUpdatedSharedData(
			"defaultSheetMaterialId",
			readSetting("defaultSheetMaterialId"),
			obj,
		);
	}
	wsi4.sharedData.write(obj);
}

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

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

	return {
		scripts: createScriptsSection(),
	};
}
