ll := import("@platforma-sdk/workflow-tengo:ll")
file := import("@platforma-sdk/workflow-tengo:file")
text := import("text")
smart := import("@platforma-sdk/workflow-tengo:smart")
render := import("@platforma-sdk/workflow-tengo:render")
assets := import("@platforma-sdk/workflow-tengo:assets")
pframes := import("@platforma-sdk/workflow-tengo:pframes")
constants := import("@platforma-sdk/workflow-tengo:constants")
validation := import("@platforma-sdk/workflow-tengo:validation")

eMulTpl := assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-multiple-pcolumns")








exportPFrame := func(pfResource, skipHideDataFromUI) {



	fields := pfResource.inputs()

	ll.assert(pfResource.info().InputsLocked, "pframe resource not locked for export: %v", pfResource.info().Type)


	if pfResource.checkResourceType(constants.RTYPE_CONTEXT) {
		newFields := {}
		for rawFieldName, fieldValue in fields {
			if text.has_prefix(rawFieldName, "values/") {
				fieldName := rawFieldName[7:]
				newFields[fieldName] = fieldValue
			} else if rawFieldName == "id" || rawFieldName == "parent" {

				continue
			} else {
				ll.panic("Unexpected context field: %v", rawFieldName)
			}
		}

		fields = newFields
	}




	columns := {}

	getOrCreateColumn := func(name) {
		c := columns[name]
		if is_undefined(c) {
			c = {}
			columns[name] = c
		}
		return c
	}

	for fieldName, fieldValue in fields {
		if text.has_suffix(fieldName, ".spec") {
			if !(fieldValue.getValue().checkResourceType(constants.RTYPE_JSON) || fieldValue.getValue().checkResourceType(constants.RTYPE_OBJECT_SPEC)) {
				ll.panic("Unexpected spec value type: %v", fieldValue.getValue().info().Type)
			}
			col := getOrCreateColumn(fieldName[:len(fieldName) - 5])
			col.spec = fieldValue.getValue().getDataAsJson()
			col.specRaw = fieldValue
		} else if text.has_suffix(fieldName, ".data") {
			col := getOrCreateColumn(fieldName[:len(fieldName) - 5])
			col.data = fieldValue
		} else {
			ll.panic("Unexpected field name: %v", fieldName)
		}
	}

	validation.assertType(columns, {any: {
		"spec,?": "any",
		"specRaw,?": validation.reference,
		"data,?": validation.reference
	}})




	result := pframes.pFrameBuilder()


	eMulTplInput := smart.mapBuilder()

	eMulTplRender := render.createEphemeral(eMulTpl, { data: eMulTplInput })

	for colName, col in columns {
		if is_undefined(col.data) {
			result.add(colName, col.specRaw)
			continue
		}

		shouldHideDataFromUI := skipHideDataFromUI && !is_undefined(col.spec) && col.spec.annotations["pl7.app/hideDataFromUi"] == "true"
		if shouldHideDataFromUI {

			result.add(colName, col.specRaw)
			continue
		}

		if is_undefined(col.spec) || (
			col.spec.kind == "PColumn" && (
				is_undefined(col.spec.valueType) ||
					col.spec.valueType == "file" || col.spec.valueType == "blob" ||
					col.spec.valueType == "File" || col.spec.valueType == "Blob" ||
					col.spec.valueType == "Int" || col.spec.valueType == "Long" ||
					col.spec.valueType == "Float" || col.spec.valueType == "Double" ||
					col.spec.valueType == "String" || col.spec.valueType == "Bytes")) {

			result.add(colName, col.specRaw, eMulTplRender.output(colName))
			eMulTplInput.add(colName, col.data)
			continue
		}

		if col.spec.kind == "File" {
			result.add(colName, col.specRaw, file.exportFile(col.data))
			continue
		}

		result.add(colName, col.specRaw, col.data)
	}

	eMulTplInput.build()

	return result.build()
}

export ll.toStrict({
	exportPFrame: exportPFrame
})
