package net.onrc.onos.api.flowmanager;

import java.util.List;

import net.onrc.onos.api.flowmanager.FlowBatchOperation.Operator;
import net.onrc.onos.core.matchaction.MatchActionId;
import net.onrc.onos.core.matchaction.MatchActionOperations;
import net.onrc.onos.core.matchaction.MatchActionOperationsId;
import net.onrc.onos.core.matchaction.action.Action;
import net.onrc.onos.core.matchaction.match.PacketMatch;
import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
import net.onrc.onos.core.util.IdGenerator;
import net.onrc.onos.core.util.PortNumber;

/**
 * Flow object representing an optical path.
 * <p>
 * TODO: Think this: How do we deal the optical path flow going through the
 * regenerators? Can we express it with multiple OpticalPathFlow objects?
 * <p>
 * NOTE: This class is not fully supported for the August release.
 */
public class OpticalPathFlow extends PathFlow {
    private final int lambda;

    /**
     * Default constructor for Kryo deserialization.
     */
    @Deprecated
    protected OpticalPathFlow() {
        lambda = 0;
    }

    /**
     * Constructor.
     *
     * @param id the ID for this new Flow object
     * @param ingressPort the Ingress port number at the ingress edge node
     * @param path the Path between ingress and egress edge node
     * @param egressActions the list of Action objects at the egress edge node
     * @param lambda the lambda to be used throughout the path
     */
    public OpticalPathFlow(FlowId id,
            PortNumber ingressPort, Path path, List<Action> egressActions, int lambda) {
        super(id, ingressPort, path, egressActions);
        this.lambda = lambda;
    }

    /**
     * Gets lambda which is used throughout the path.
     *
     * @return lambda which is used throughout the path
     */
    public int getLambda() {
        return lambda;
    }

    /**
     * Gets traffic filter for this flow.
     * <p>
     * This method only returns wildcard match, because the ingress transponder
     * port does not have filtering functionality.
     */
    @Override
    public PacketMatch getMatch() {
        return (new PacketMatchBuilder()).build();
    }

    @Override
    public List<MatchActionOperations> compile(Operator op,
            IdGenerator<MatchActionId> maIdGenerator,
            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
        // TODO Auto-generated method stub
        return null;
    }
}
