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

import (
	basegraph 
	
)

// DepthFirstCycleBreaker is the direct ELK 0.8.1 depth-first cycle breaker.
// Edges encountered while their target is active on the DFS path are reversed
// after traversal, preserving Java's edge-iteration and reversal order.
type DepthFirstCycleBreaker struct{}

func (*DepthFirstCycleBreaker) (
	 *layered.LGraphArena,
	 layered.LGraphID,
) layered.ProcessorConfiguration {
	return layered.GreedyCycleConfiguration()
}

func (*DepthFirstCycleBreaker) ( *layered.LGraphArena,  layered.LGraphID) error {
	 := .Graph().LayerlessNodes
	 := make([]bool, len())
	 := make([]bool, len())
	 := make([]layered.LNodeID, 0)
	 := make([]layered.LEdgeID, 0)

	for ,  := range  {
		.Node().ID = 
		 := false
		for ,  := range .NodeIncomingEdges() {
			if !.EdgeIsSelfLoop() {
				 = true
				break
			}
		}
		if ! {
			 = append(, )
		}
	}

	var  func(layered.LNodeID)
	 = func( layered.LNodeID) {
		 := .Node().ID
		if [] {
			return
		}
		[] = true
		[] = true
		for ,  := range .NodeOutgoingEdges() {
			if .EdgeIsSelfLoop() {
				continue
			}
			 := .EdgeTargetNode()
			if [.Node().ID] {
				 = append(, )
			} else {
				()
			}
		}
		[] = false
	}

	for ,  := range  {
		()
	}
	for ,  := range  {
		if ![] {
			()
		}
	}
	for ,  := range  {
		.ReverseEdge(, , true)
		basegraph.Set(&.Graph().Properties, layered.Cyclic, true)
	}
	return nil
}