/**
 *    Copyright 2011, Big Switch Networks, Inc.
 *    Originally created by David Erickson, Stanford University
 *
 *    Licensed under the Apache License, Version 2.0 (the "License"); you may
 *    not use this file except in compliance with the License. You may obtain
 *    a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 *    License for the specific language governing permissions and limitations
 *    under the License.
 **/

package net.floodlightcontroller.core;

import java.util.List;
import java.util.Map;
import java.util.Set;

import net.floodlightcontroller.core.internal.Controller.Counters;
import net.floodlightcontroller.core.module.IFloodlightService;
import net.onrc.onos.core.packet.Ethernet;
import net.onrc.onos.core.util.OnosInstanceId;

import org.projectfloodlight.openflow.protocol.OFControllerRole;
import org.projectfloodlight.openflow.protocol.OFFactory;
import org.projectfloodlight.openflow.protocol.OFType;

/**
 * The interface exposed by the core bundle that allows you to interact
 * with connected switches.
 *
 * @author David Erickson (daviderickson@cs.stanford.edu)
 */
public interface IFloodlightProviderService extends IFloodlightService {

    /**
     * A value stored in the floodlight context containing a parsed packet
     * representation of the payload of a packet-in message.
     */
    public static final String CONTEXT_PI_PAYLOAD =
            "net.floodlightcontroller.core.IFloodlightProvider.piPayload";
    public static final String CONTEXT_PI_INPORT =
            "net.floodlightcontroller.core.IFloodlightProvider.piInPort";;
    /**
     * The role of the controller as it pertains to a particular switch.
     * Note that this definition of the role enum is different from the
     * OF1.3 definition. It is maintained here to be backward compatible to
     * earlier versions of the controller code. This enum is translated
     * to the OF1.3 enum, before role messages are sent to the switch.
     * See sendRoleRequestMessage method in OFSwitchImpl
     */
    public static enum Role {
        EQUAL(OFControllerRole.ROLE_EQUAL),
        MASTER(OFControllerRole.ROLE_MASTER),
        SLAVE(OFControllerRole.ROLE_SLAVE);

        private final int nxRole;

        private Role(OFControllerRole nxRole) {
            this.nxRole = nxRole.ordinal();
        }
        /*
        private static Map<Integer,Role> nxRoleToEnum
                = new HashMap<Integer,Role>();
        static {
            for(Role r: Role.values())
                nxRoleToEnum.put(r.toNxRole(), r);
        }
        public int toNxRole() {
            return nxRole;
        }
        // Return the enum representing the given nxRole or null if no
        // such role exists
        public static Role fromNxRole(int nxRole) {
            return nxRoleToEnum.get(nxRole);
        }*/
    }

    /**
     * A FloodlightContextStore object that can be used to retrieve the
     * packet-in payload
     */
    public static final FloodlightContextStore<Ethernet> bcStore =
            new FloodlightContextStore<Ethernet>();


    //************************
    //  Controller related
    //************************

    /**
     * Get the current mapping of controller IDs to their IP addresses
     * Returns a copy of the current mapping.
     *
     * @see IHAListener
     */
    public Map<String, String> getControllerNodeIPs();

    /**
     * Return the controller start time in  milliseconds
     *
     * @return
     */
    public long getSystemStartTime();

    /**
     * Run the main I/O loop of the Controller.
     */
    public void run();

//    /**
//     * Terminate the process
//     */
//    public void terminate();

    //************************
    //  OF Message Listener related
    //************************

    /**
     * Adds an OpenFlow message listener
     *
     * @param type     The OFType the component wants to listen for
     * @param listener The component that wants to listen for the message
     */
    public void addOFMessageListener(OFType type, IOFMessageListener listener);

    /**
     * Removes an OpenFlow message listener
     *
     * @param type     The OFType the component no long wants to listen for
     * @param listener The component that no longer wants to receive the message
     */
    public void removeOFMessageListener(OFType type, IOFMessageListener listener);

    /**
     * Return a non-modifiable list of all current listeners
     *
     * @return listeners
     */
    public Map<OFType, List<IOFMessageListener>> getListeners();

    //************************
    //  Switch & SwitchListener related
    //************************

    /**
     * Returns an unmodifiable map of all actively connected OpenFlow switches. This doesn't
     * contain switches that are connected but the controller's in the slave role.
     *
     * @return the set of actively connected switches
     */
    public Map<Long, IOFSwitch> getSwitches();

    /**
     * Configure controller to always clear the flow table on the switch,
     * when it connects to controller. This will be true for first time switch
     * reconnect, as well as a switch re-attaching to Controller after HA
     * switch over to ACTIVE role
     */
    public void setAlwaysClearFlowsOnSwAdd(boolean value);

    /**
     * Gets the unique ID used to identify this ONOS instance in the cluster.
     *
     * @return ONOS Instance ID.
     */
    public OnosInstanceId getOnosInstanceId();

    /**
     * Add a switch listener
     *
     * @param listener The module that wants to listen for events
     */
    public void addOFSwitchListener(IOFSwitchListener listener);

    /**
     * Remove a switch listener
     *
     * @param listener The The module that no longer wants to listen for events
     */
    public void removeOFSwitchListener(IOFSwitchListener listener);



    //************************
    //  Utility methods
    //************************

    /**
     * Gets the Factory
     *
     * @return an OpenFlow message factory
     */
    public OFFactory getOFMessageFactory_13();
    public OFFactory getOFMessageFactory_10();

    /**
     * Publish updates to Controller updates queue
     *
     * @param IUpdate
     */
    public void publishUpdate(IUpdate update);

//    /**
//     * Re-injects an OFMessage back into the packet processing chain
//     *
//     * @param sw  The switch to use for the message
//     * @param msg the message to inject
//     * @return True if successfully re-injected, false otherwise
//     */
//    public boolean injectOfMessage(IOFSwitch sw, OFMessage msg);
//
//    /**
//     * Re-injects an OFMessage back into the packet processing chain
//     *
//     * @param sw       The switch to use for the message
//     * @param msg      the message to inject
//     * @param bContext a floodlight context to use if required
//     * @return True if successfully re-injected, false otherwise
//     */
//    public boolean injectOfMessage(IOFSwitch sw, OFMessage msg,
//                                   FloodlightContext bContext);
//
//    /**
//     * Process written messages through the message listeners for the controller
//     *
//     * @param sw The switch being written to
//     * @param m  the message
//     * @param bc any accompanying context object
//     */
//    public void handleOutgoingMessage(IOFSwitch sw, OFMessage m,
//                                      FloodlightContext bc);


    /**
     * Return the default set of counters
     * @return
     */
    public Counters getCounters();

    void setAlwaysClearFlowsOnSwActivate(boolean value);

    Map<String, Long> getMemory();

    Long getUptime();

    Set<Long> getAllSwitchDpids();

    IOFSwitch getSwitch(long dpid);

    /**
     * Record a switch event in in-memory debug-event
     * @param switchDPID
     * @param reason Reason for this event
     * @param flushNow see debug-event flushing in IDebugEventService
     */
    public void addSwitchEvent(long switchDPID, String reason, boolean flushNow);

    Set<Long> getAllMasterSwitchDpids();

    Set<Long> getAllEqualSwitchDpids();

    IOFSwitch getMasterSwitch(long dpid);

    IOFSwitch getEqualSwitch(long dpid);
}
