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

interface TubeCuttingLayerNumber {
	cuttingOuterContour: number;
	cuttingInnerContour: number;
	unfoldCuts: number;
	tubeOutlines: number;
}

export type TubeCuttingLayerKey = keyof TubeCuttingLayerNumber;

/**
 * Number of layers of a tubeCutting related Layered.
 *
 * XXX Not to be confused with a Layer's descriptor.
 * Use wsi4.geo.layerDescriptorWithNumber() or a higher level
 * utility function to get the associated layer descriptor.
 */
const tubeCuttingLayerNumber = Object.freeze<TubeCuttingLayerNumber>({
	// Actually cut outer contours
	cuttingOuterContour: 0,

	// Actually cut inner contours
	cuttingInnerContour: 8,

	// "Virtual" cut to unfold the closed profile
	unfoldCuts: 4,

	// Outlines of the tube's "bends"
	tubeOutlines: 5,
});

/**
 * Get layerDescriptor for the layer associated with [[key]]
 */
export function tubeCuttingLayerDescriptor(key: keyof TubeCuttingLayerNumber, layered: Layered): number {
	const layerNumber = tubeCuttingLayerNumber[key];
	const descriptor = wsi4.geo.util.layerDescriptorWithNumber(layered, layerNumber);
	assert(descriptor !== undefined, "Expecting valid layer descriptor for layer with number " + layerNumber.toString());
	return descriptor;
}

/**
 * Get paths for the layer associated with [[key]]
 */
export function tubeCuttingLayerPaths(key: keyof TubeCuttingLayerNumber, layered: Layered): Segment[][] {
	const layerDescriptor = tubeCuttingLayerDescriptor(key, layered);
	return wsi4.geo.util.layerPaths(layered, layerDescriptor);
}
