import {
	WorkStepType,
} from "qrc:/js/lib/generated/enum";
import {
	isCompatibleToNodeUserDataEntry,
	nodeUserDatumOrDefault,
} from "./userdata_utils";
import {
	assertDebug,
	computeArrayIntersection,
} from "./utils";

/**
 * @param vertex The article
 * @returns Undefined if no sheet filter is set, else the intersections of all sheet filters of the targets
 */
export function sheetFilterSheetIds(vertex: Vertex) : string[]|undefined {
	assertDebug(() => wsi4.node.workStepType(vertex) === WorkStepType.sheet, "Pre-condition violated");
	const filter: string[][] = [];
	for (const r of wsi4.graph.reachable(vertex)) {
		if (isCompatibleToNodeUserDataEntry("sheetFilterSheetIds", r)) {
			const f = nodeUserDatumOrDefault("sheetFilterSheetIds", r);
			if (f.length === 0) {
				// no filter means every sheet is allowed, so don't add it to filter
				continue;
			}
			filter.push(f);
		}
	}
	if (filter.length === 0) {
		// no filter set
		return undefined;
	}
	return computeArrayIntersection(filter);
}

export function extractUserSelection(vertex: Vertex, preselection: Array<Sheet>): Array<Sheet> {
	const sheetIdFilter = sheetFilterSheetIds(vertex);
	if (sheetIdFilter === undefined) {
		// No filter, return preselection
		return preselection;
	}
	return preselection.filter(entry => sheetIdFilter.find(id => id === entry.identifier) !== undefined);
}
