// Copyright (c) 2019 Kiel University and others.
//
// SPDX-License-Identifier: EPL-2.0

package intermediate

import (
	

	basegraph 
	
	
	
)

// RestoreSelfLoopPorts restores hidden self-loop ports and computes the loop
// types needed by routing.
func ( *layered.LGraphArena,  layered.LGraphID) error {
	for ,  := range .Graph().Layers {
		for ,  := range .Layer().Nodes {
			 := .Node()
			if .Type != layered.NormalNode {
				continue
			}
			,  := basegraph.TryGet(&.Properties, loops.HolderProperty)
			if ! {
				continue
			}
			if  := restoreNodeSelfLoopPorts(, );  != nil {
				return 
			}
		}
	}
	return nil
}

func restoreNodeSelfLoopPorts( *layered.LGraphArena,  *loops.Holder) error {
	if .PortsHidden {
		switch basegraph.Get(&.Node(.LNode).Properties, layered.OriginalPortConstraints) {
		case layered.PortConstraintsUndefined, layered.PortConstraintsFree:
			if  := ordering.AssignPortSides(, );  != nil {
				return 
			}
		case layered.PortConstraintsFixedSide:
			// The sides were preserved while the ports were hidden.
		default:
			return fmt.Errorf("hidden self-loop ports require non-fixed port order")
		}
	}

	for ,  := range .HyperLoops {
		if  := .ComputePortsPerSide();  != nil {
			return 
		}
	}
	if .PortsHidden {
		return ordering.RestorePorts(, )
	}
	return nil
}