// Copyright (c) 2012, 2020 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 
	
)

// RemoveLabelDummies places represented center labels, rejoins their edges,
// and removes label dummies from their layers.
func ( *layered.LGraphArena,  layered.LGraphID) {
	 := .Graph()
	 := basegraph.Get(&.Properties, layered.SpacingEdgeLabel)
	 := basegraph.Get(&.Properties, layered.SpacingLabelLabel)
	 := basegraph.Get(&.Properties, layered.DirectionOption)

	for ,  := range .Layers {
		 := .Layer().Nodes
		 := [:0]
		for ,  := range  {
			 := .Node()
			if .Type != layered.LabelNode {
				 = append(, )
				continue
			}
			 := basegraph.Get(&.Properties, layered.OriginalElement)
			if .Kind != layered.OriginLEdge {
				panic("layered: label dummy origin is not an LEdge")
			}
			 := .Edge(.LEdge)
			 := basegraph.Get(&.Properties, layered.EdgeThickness)
			 := basegraph.Get(&.Properties, layered.InternalLabelSide) == layered.LabelSideBelow
			 := .Position
			if  {
				.Y +=  + 
			}
			 := basegraph.Get(&.Properties, layered.RepresentedLabels)
			 := representedLabelsAreInline(, )
			 := .Size.X
			 := .Size.Y
			if ! {
				 -=  + 
			}
			if directionIsVertical() {
				placeVerticalCenterLabels(, , .X, .Y,
					, , , )
			} else {
				placeHorizontalCenterLabels(, , .X, .Y,
					, )
			}
			.Labels = append(.Labels, ...)
			JoinLongEdgeAt(, ,
				basegraph.Get(&.Properties, layered.EdgeRoutingOption) == layered.EdgeRoutingPolyline)
		}
		.Layer().Nodes = 
	}
}

func representedLabelsAreInline(
	 *layered.LGraphArena,
	 []layered.LLabelID,
) bool {
	for ,  := range  {
		if !basegraph.Get(&.Label().Properties, layered.EdgeLabelsInline) {
			return false
		}
	}
	return true
}

func placeHorizontalCenterLabels(
	 *layered.LGraphArena,
	 []layered.LLabelID,
	, , ,  float64,
) {
	for ,  := range  {
		 := .Label()
		.Position.X =  + (-.Size.X)/2
		.Position.Y = 
		 += .Size.Y + 
	}
}

func placeVerticalCenterLabels(
	 *layered.LGraphArena,
	 []layered.LLabelID,
	, , ,  float64,
	 bool,
	 layered.Direction,
) {
	 := representedLabelsAreInline(, )
	 := make([]int, len())
	for  := range  {
		[] = 
		if  == layered.DirectionUp {
			[] = len() - 1 - 
		}
	}
	for ,  := range  {
		 := .Label([])
		.Position.X = 
		switch {
		case :
			.Position.Y =  + (-.Size.Y)/2
		case :
			.Position.Y = 
		default:
			.Position.Y =  +  - .Size.Y
		}
		 += .Size.X + 
	}
}