// Copyright (c) 2016 Kiel University and others.
// Copyright (c) 2026 The elk-go Authors.
//
// 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 wrapping

import (
	

	basegraph 
	
)

// InsertDummies inserts the two in-layer and intervening long-edge dummies
// used to route one wrapping edge back across the drawing.
func (
	 *layered.LGraphArena,
	 layered.LGraphID,
	 layered.LEdgeID,
	 int,
) []layered.LEdgeID {
	 := .Graph()
	 := layered.IndividualSpacings{}
	basegraph.Set(&.Properties, layered.SpacingEdgeNode,
		basegraph.Get(&.Properties, layered.SpacingEdgeNode)+
			basegraph.Get(&.Properties, layered.WrappingAdditionalEdgeSpacing))

	 := 
	 := *.Edge().Target
	 := .EdgeSourceNode()
	 := .EdgeTargetNode()
	 := .LayerIndex(*.Node().Layer)
	 := .LayerIndex(*.Node().Layer)
	 := make([]layered.LEdgeID, 0, -+1)

	for  := ;  <= ; ++ {
		 := .Layers[]
		 := .AddNode()
		 := .Node()
		.Type = layered.LongEdgeNode
		basegraph.Set(&.Properties, layered.OriginalElement, layered.LEdgeOrigin())
		basegraph.Set(&.Properties, layered.PortConstraintsOption, layered.PortConstraintsFixedPosition)
		basegraph.Set(&.Properties, layered.SpacingIndividual, )
		if  ==  {
			.SetNodeLayerAt(, &, len(.Layer().Nodes)-)
		} else {
			.SetNodeLayer(, &)
		}

		 := basegraph.Get(&.Edge().Properties, layered.EdgeThickness)
		if  < 0 {
			 = 0
			basegraph.Set(&.Edge().Properties, layered.EdgeThickness, )
		}
		.Size.Y = 
		 := math.Floor( / 2)

		 := .AddPort()
		.SetPortSide(, layered.WestSide)
		.SetPortNode(, &)
		.Port().Position.Y = 
		 := .AddPort()
		.SetPortSide(, layered.EastSide)
		.SetPortNode(, &)
		.Port().Position.Y = 

		.SetEdgeTarget(, &)
		 := .AddEdge()
		.Edge().Properties.CopyFrom(&.Edge().Properties)
		basegraph.Unset(&.Edge().Properties, layered.JunctionPoints)
		.SetEdgeSource(, &)
		.SetEdgeTarget(, &)
		setDummyProperties(, , , )
		 = append(, )
		 = 
	}
	return 
}

func setDummyProperties(
	 *layered.LGraphArena,
	 layered.LNodeID,
	 layered.LEdgeID,
	 layered.LEdgeID,
) {
	 := .EdgeSourceNode()
	if .Node().Type == layered.LongEdgeNode {
		if ,  := basegraph.TryGet(&.Node().Properties, layered.LongEdgeSource);  {
			basegraph.Set(&.Node().Properties, layered.LongEdgeSource, )
		}
		if ,  := basegraph.TryGet(&.Node().Properties, layered.LongEdgeTarget);  {
			basegraph.Set(&.Node().Properties, layered.LongEdgeTarget, )
		}
		return
	}
	basegraph.Set(&.Node().Properties, layered.LongEdgeSource, *.Edge().Source)
	basegraph.Set(&.Node().Properties, layered.LongEdgeTarget, *.Edge().Target)
}