import {
	TableType,
} from "qrc:/js/lib/generated/enum";

import {
	getTable,
} from "./table_utils";
import {
	assert,
} from "./utils";

export interface TappingDataEntry {
	screwThreadId: string;
	depth: number;
}

export interface TappingTimeCalcParams {
	tappingData: readonly Readonly<TappingDataEntry>[];
	processId: string;
}

/**
 * Compute tapping manufacturing time
 *
 * @param calcParams  Calculation parameters
 *
 * Pre-condition:  Underlying data is consistent.  For each TappingDataEntry there should be a tapping time parameter table entry.
 */
export function computeTappingUnitTimePerPiece(calcParams: Readonly<TappingTimeCalcParams>): number {
	const tappingTimeParams = getTable(TableType.tappingTimeParameters);
	return calcParams.tappingData.reduce((acc, entry) => {
		const params = tappingTimeParams.find(params => params.processId === calcParams.processId && params.screwThreadId === entry.screwThreadId);
		assert(params !== undefined, "Expecting valid tapping parameters " + JSON.stringify(calcParams, null, "\t") + "\n" + JSON.stringify(tappingTimeParams, null, "\t"));
		return acc + entry.depth * params.unitTimePerMm;
	}, 0);
}
