package Heuristics;

import java.util.HashMap;
import java.util.Map;
import FaultTree.*;
import Heuristics.Helpers.DepthFirstByWeightOrderer;

public class ByWeightHeuristic implements Heuristic {
    private class FaultTreeScale extends AbstractFaultTreeVisitor {
        private Map<FaultTree, Integer> weights = new HashMap<>();

        @Override
        public void visitIntermediateEvent(IntermediateEvent event) {
            visit(event.left);
            visit(event.right);
            weights.put(event, weights.get(event.left) + weights.get(event.right));
        }

        @Override
        public void visitBasicEvent(BasicEvent event) {
            weights.put(event, 1);
        }

        public Map<FaultTree, Integer> getWeights() {
            return weights;
        }
    }

    @Override
    public Map<BasicEvent, Integer> getOrder(FaultTree tree) {
        var scale = new FaultTreeScale();
        scale.visit(tree);
        var weights = scale.getWeights();
        var orderer = new DepthFirstByWeightOrderer(weights);
        orderer.visit(tree);
        return orderer.getOrder();
    }
}