import {
	lookUpTubeCuttingPierceTime,
	lookUpTubeCuttingSpeed,
} from "./table_utils";

export interface TubeCuttingCalcParams {
	cuttingPaths: Segment[][];
	engravingPaths: Segment[][];
	thickness: number;
	tubeCuttingProcessId: string;
}

function computeEmptyRunTime(paths: Segment[][], vMax: number, aMax: number) {
	const inputPoints = paths.map(path => path[0].content.from);
	const tspOrder = wsi4.geo.util.tsp(inputPoints);
	const tspPoints = tspOrder.map(i => inputPoints[i]);
	return wsi4.cam.laser.computePointsTime(tspPoints, vMax, aMax);
}

export function computeTubeCuttingUnitTimePerPiece(params: Readonly<TubeCuttingCalcParams>): number | undefined {
	// [mm/s]
	const vMaxEmptyRun = 50 * 1000 / 60;

	// [mm/s^2]
	const aMaxEmptyRun = 5000;

	// [mm/s]
	const vMaxCutting = lookUpTubeCuttingSpeed(params);

	// [mm/s^2]
	const aMaxCutting = 2500;

	// [s]
	const pierceTime = lookUpTubeCuttingPierceTime(params);

	if (vMaxCutting === undefined || pierceTime === undefined) {
		return undefined;
	}

	// [s]
	const cuttingTime = params.cuttingPaths.reduce((acc, path) => acc + pierceTime + wsi4.cam.laser.computeSegmentsTime(path, vMaxCutting, aMaxCutting), 0.)
		+ computeEmptyRunTime(params.cuttingPaths, vMaxEmptyRun, aMaxEmptyRun);

	// [s]
	const engravingTime = params.engravingPaths.reduce((acc, path) => acc + wsi4.cam.laser.computeSegmentsTime(path, vMaxEmptyRun, aMaxEmptyRun), 0)
		+ computeEmptyRunTime(params.engravingPaths, vMaxEmptyRun, aMaxEmptyRun);

	// [s]
	return cuttingTime + engravingTime;
}
