package net.onrc.onos.core.newintent;

import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import net.onrc.onos.api.flowmanager.FlowIdGenerator;
import net.onrc.onos.api.flowmanager.FlowLink;
import net.onrc.onos.api.flowmanager.PacketPathFlow;
import net.onrc.onos.api.flowmanager.Path;
import net.onrc.onos.api.newintent.Intent;
import net.onrc.onos.api.newintent.IntentIdGenerator;
import net.onrc.onos.api.newintent.PathIntent;
import net.onrc.onos.core.matchaction.match.Match;
import net.onrc.onos.core.matchaction.match.PacketMatch;
import net.onrc.onos.core.util.LinkTuple;

import java.util.Arrays;
import java.util.List;

/**
 * An intent compiler for {@link PathIntent}.
 */
public class PathIntentCompiler
        extends AbstractFlowGeneratingIntentCompiler<PathIntent> {

    /**
     * Construct an {@link net.onrc.onos.api.newintent.IntentCompiler}
     * for {@link PathIntent}.
     *
     * @param intentIdGenerator intent ID generator
     * @param flowIdGenerator flow ID generator
     */
    public PathIntentCompiler(IntentIdGenerator intentIdGenerator,
                              FlowIdGenerator flowIdGenerator) {
        super(intentIdGenerator, flowIdGenerator);
    }

    @Override
    public List<Intent> compile(PathIntent intent) {
        Match match = intent.getMatch();
        if (!(match instanceof PacketMatch)) {
            throw new IntentCompilationException(
                    "intent has unsupported type of match object: " + match
            );
        }

        Path path = convertPath(intent.getPath());
        PacketPathFlow flow = new PacketPathFlow(
                getNextFlowId(),
                (PacketMatch) match,
                intent.getIngressPort().getPortNumber(),
                path,
                packActions(intent, intent.getEgressPort()),
                0, 0
        );
        Intent compiled = new PathFlowIntent(getNextId(), flow);
        return Arrays.asList(compiled);
    }

    /**
     * Converts list of {@link LinkTuple LinkTuples} to a {@link Path}.
     *
     * @param tuples original list of {@link LinkTuple LinkTuples}
     * @return converted {@link Path}
     */
    private Path convertPath(List<LinkTuple> tuples) {
        // would like to use filter and transform, but Findbugs detects
        // inconsistency of use of @Nullable annotation. Then, use of the
        // transform is avoided.
        // Ref: https://code.google.com/p/guava-libraries/issues/detail?id=1812
        // TODO: replace with transform when the above issue is resolved
        ImmutableList<LinkTuple> links = FluentIterable.from(tuples)
                .filter(Predicates.notNull())
                .toList();

        Path path = new Path();
        for (LinkTuple link: links) {
            path.add(new FlowLink(link.getSrc(), link.getDst()));
        }
        return path;
    }
}
