// Copyright (c) 2012, 2017 Kiel University and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0.
//
// SPDX-License-Identifier: EPL-2.0

package intermediate

import (
	

	basegraph 
	
)

// InsertLabelDummies replaces center labels on non-self-loop edges with one
// label dummy per edge. New dummies are appended only after the original
// layerless-node traversal, as in ELK's implementation.
func ( *layered.LGraphArena,  layered.LGraphID) {
	 := .Graph()
	 := basegraph.Get(&.Properties, layered.SpacingEdgeLabel)
	 := basegraph.Get(&.Properties, layered.SpacingLabelLabel)
	 := directionIsVertical(basegraph.Get(&.Properties, layered.DirectionOption))
	 := make([]layered.LNodeID, 0)

	for ,  := range append([]layered.LNodeID(nil), .LayerlessNodes...) {
		for ,  := range .NodeOutgoingEdges() {
			if .EdgeIsSelfLoop() || !edgeHasCenterLabel(, ) {
				continue
			}
			 := basegraph.Get(&.Edge().Properties, layered.EdgeThickness)
			if  < 0 {
				 = 0
				basegraph.Set(&.Edge().Properties, layered.EdgeThickness, )
			}
			 := createLabelDummy(, , )
			 = append(, )
			 := .Node()
			 := make([]layered.LLabelID, 0, len(.Edge().Labels))
			 := .Edge().Labels[:0]
			for ,  := range .Edge().Labels {
				 := .Label()
				if basegraph.Get(&.Properties, layered.EdgeLabelsPlacement) != layered.EdgeLabelPlacementCenter {
					 = append(, )
					continue
				}
				if  {
					.Size.X += .Size.X + 
					.Size.Y = math.Max(.Size.Y, .Size.Y)
				} else {
					.Size.X = math.Max(.Size.X, .Size.X)
					.Size.Y += .Size.Y + 
				}
				 = append(, )
			}
			.Edge().Labels = 
			basegraph.Set(&.Properties, layered.RepresentedLabels, )
			if  {
				.Size.X -= 
				.Size.Y +=  + 
			} else {
				.Size.Y +=  -  + 
			}
		}
	}
	.LayerlessNodes = append(.LayerlessNodes, ...)
}

func edgeHasCenterLabel( *layered.LGraphArena,  layered.LEdgeID) bool {
	for ,  := range .Edge().Labels {
		if basegraph.Get(&.Label().Properties, layered.EdgeLabelsPlacement) == layered.EdgeLabelPlacementCenter {
			return true
		}
	}
	return false
}

func createLabelDummy(
	 *layered.LGraphArena,
	 layered.LGraphID,
	 layered.LEdgeID,
) layered.LNodeID {
	 := .AddNode()
	 := .Node()
	.Type = layered.LabelNode
	basegraph.Set(&.Properties, layered.OriginalElement, layered.LEdgeOrigin())
	basegraph.Set(&.Properties, layered.PortConstraintsOption, layered.PortConstraintsFixedPosition)
	basegraph.Set(&.Properties, layered.LongEdgeSource, *.Edge().Source)
	basegraph.Set(&.Properties, layered.LongEdgeTarget, *.Edge().Target)
	SplitEdgeAtDummy(, , )
	 := math.Floor(basegraph.Get(&.Edge().Properties, layered.EdgeThickness) / 2)
	for ,  := range .Ports {
		.Port().Position.Y = 
	}
	return 
}

func directionIsVertical( layered.Direction) bool {
	return  == layered.DirectionDown ||  == layered.DirectionUp
}