ll := import("@platforma-sdk/workflow-tengo:ll")
wf := import("@platforma-sdk/workflow-tengo:workflow")
util := import("@platforma-sdk/workflow-tengo:annotations.util")
render := import("@platforma-sdk/workflow-tengo:render")
assets := import("@platforma-sdk/workflow-tengo:assets")
slices := import("@platforma-sdk/workflow-tengo:slices")
validation := import("@platforma-sdk/workflow-tengo:validation")

compute := assets.importTemplate("@platforma-sdk/workflow-tengo:annotations.compute")

_STEP_SCHEMA := {
	type: "string",
	name: "string",
	value: { "any": "any" }
}

_STEP_SCHEMAS := [_STEP_SCHEMA]


















computeAnnotations := func(inputs) {
	if len(inputs.steps) == 0 {
		return {}
	}

	validation.assertType(inputs.steps, _STEP_SCHEMAS)

	steps := inputs.steps
	title := inputs.title
	anchorRef := inputs.anchorRef
	defaultValue := inputs.defaultValue
	resultAxesSpec := inputs.resultAxesSpec
	resultColumnSpec := util.prepareResultColumnSpec(inputs)
	shouldComputeFilters := is_bool(inputs.shouldComputeFilters) ? inputs.shouldComputeFilters : false
	
	columnsFromExpressions := util.extractColumnsFromExpressions(slices.map(steps, func(step) { return step.value }))
	additionalColumns := is_array(inputs.additionalColumns) ? inputs.additionalColumns : []
	columns := slices.unique(columnsFromExpressions + additionalColumns)
	
	bundleBuilder := wf.createPBundleBuilder()
	bundleBuilder.addAnchor("main", anchorRef)
	for column in columns { bundleBuilder.addById(column) }
	columnBundle := bundleBuilder.build()

	result := render.create(compute, {
		columnBundle: columnBundle,
		params: {
			steps: steps,
			columns: columns,
			defaultValue: defaultValue,
			resultColumnSpec: resultColumnSpec,
			shouldComputeFilters: shouldComputeFilters
		}
	})

	annotationsData := result.output("annotationsData")
	annotationsColumn := { column: util.ANNOTATION_HEADER, data: annotationsData, spec: resultColumnSpec }

	idx := 0
	annotationsFiltersColumns := shouldComputeFilters ? slices.map(steps, func(v) {
		idx += 1
		column := util.encodeColumnName(v.name, idx)
		filterData := result.resolveOutput(["filtersData", column])
		filterSpec := util.createFilterColumnSpec(resultColumnSpec, column, v.name)
		return {
			column: v.name,
			data: filterData,
			spec: filterSpec
		}
	}) : []

	return {
		annotationsColumn: annotationsColumn,
		annotationsFiltersColumns: annotationsFiltersColumns
	}
}

export ll.toStrict({
	computeAnnotations: computeAnnotations
})
