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.FlowId;
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.IntentId;
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.IdGenerator;
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(IdGenerator<IntentId> intentIdGenerator,
                              IdGenerator<FlowId> 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;
    }
}
