import {
	isStringIndexedInterface,
} from "qrc:/js/lib/generated/typeguard";
import {
	exhaustiveStringTuple,
	getKeysOfObject,
	isBoolean,
	isInstanceOf,
	isString,
} from "./utils";

export type DeburringMode = "automaticSingleSided" | "automaticDoubleSided" | "manualSingleSided" | "manualDoubleSided";

export function isDeburringMode(arg: unknown): arg is DeburringMode {
	return isString(arg) && exhaustiveStringTuple<DeburringMode>()(
		"automaticSingleSided",
		"automaticDoubleSided",
		"manualSingleSided",
		"manualDoubleSided",
	).some(mode => mode === arg);
}

export interface AutomaticProcessConfig {
	deburringMode?: DeburringMode;
}

function isOptDeburringMode(arg: unknown): arg is DeburringMode | undefined {
	return arg === undefined || isDeburringMode(arg);
}

export function isAutomaticProcessConfig(arg: unknown): arg is AutomaticProcessConfig {
	return isInstanceOf<AutomaticProcessConfig>(arg, {
		deburringMode: isOptDeburringMode,
	});
}

export interface LegacyAutomaticProcessConfig {
	automaticDeburringEnabled: boolean;
	manualDeburringEnabled: boolean;
}

export function isLegacyAutomaticProcessConfig(arg: unknown): arg is LegacyAutomaticProcessConfig {
	const map : {[index in keyof LegacyAutomaticProcessConfig]: (arg: unknown) => arg is LegacyAutomaticProcessConfig[index]} = {
		automaticDeburringEnabled: isBoolean,
		manualDeburringEnabled: isBoolean,
	};
	return isStringIndexedInterface(arg) && getKeysOfObject(map)
		.every(key => map[key](arg[key]));
}

export function convertLegacyAutomaticProcessConfig(legacyConfig: Readonly<LegacyAutomaticProcessConfig>): AutomaticProcessConfig {
	if (legacyConfig.automaticDeburringEnabled) {
		return {
			deburringMode: "automaticSingleSided",
		};
	} else if (legacyConfig.manualDeburringEnabled) {
		return {
			deburringMode: "manualSingleSided",
		};
	} else {
		return {};
	}
}
