package net.onrc.onos.core.linkdiscovery;

import net.floodlightcontroller.core.IUpdate;

import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.ser.std.ToStringSerializer;
import org.openflow.util.HexString;

public interface ILinkDiscovery {

    @JsonSerialize(using = ToStringSerializer.class)
    public enum UpdateOperation {
        LINK_ADDED("Link Added"), // Operation Added by ONOS
        LINK_UPDATED("Link Updated"),
        LINK_REMOVED("Link Removed"),
        SWITCH_UPDATED("Switch Updated"),
        SWITCH_REMOVED("Switch Removed"),
        PORT_UP("Port Up"),
        PORT_DOWN("Port Down");

        private String value;

        UpdateOperation(String v) {
            value = v;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public class LDUpdate implements IUpdate {
        protected long src;
        protected short srcPort;
        protected long dst;
        protected short dstPort;
        protected SwitchType srcType;
        protected LinkType type;
        protected UpdateOperation operation;

        public LDUpdate(long src, short srcPort,
                        long dst, short dstPort,
                        ILinkDiscovery.LinkType type,
                        UpdateOperation operation) {
            this.src = src;
            this.srcPort = srcPort;
            this.dst = dst;
            this.dstPort = dstPort;
            this.type = type;
            this.operation = operation;
        }

        public LDUpdate(LDUpdate old) {
            this.src = old.src;
            this.srcPort = old.srcPort;
            this.dst = old.dst;
            this.dstPort = old.dstPort;
            this.srcType = old.srcType;
            this.type = old.type;
            this.operation = old.operation;
        }

        // For updtedSwitch(sw)
        public LDUpdate(long switchId, SwitchType stype, UpdateOperation oper) {
            this.operation = oper;
            this.src = switchId;
            this.srcType = stype;
        }

        // For port up or port down.
        public LDUpdate(long sw, short port, UpdateOperation operation) {
            this.src = sw;
            this.srcPort = port;
            this.operation = operation;
        }

        public long getSrc() {
            return src;
        }

        public short getSrcPort() {
            return srcPort;
        }

        public long getDst() {
            return dst;
        }

        public short getDstPort() {
            return dstPort;
        }

        public SwitchType getSrcType() {
            return srcType;
        }

        public LinkType getType() {
            return type;
        }

        public UpdateOperation getOperation() {
            return operation;
        }

        public void setOperation(UpdateOperation operation) {
            this.operation = operation;
        }

        @Override
        public String toString() {
            switch (operation) {
                case LINK_ADDED:
                case LINK_REMOVED:
                case LINK_UPDATED:
                    return "LDUpdate [operation=" + operation +
                            ", src=" + HexString.toHexString(src)
                            + ", srcPort=" + srcPort
                            + ", dst=" + HexString.toHexString(dst)
                            + ", dstPort=" + dstPort
                            + ", type=" + type + "]";
                case PORT_DOWN:
                case PORT_UP:
                    return "LDUpdate [operation=" + operation +
                            ", src=" + HexString.toHexString(src)
                            + ", srcPort=" + srcPort + "]";
                case SWITCH_REMOVED:
                case SWITCH_UPDATED:
                    return "LDUpdate [operation=" + operation +
                            ", src=" + HexString.toHexString(src) + "]";
                default:
                    return "LDUpdate: Unknown update.";
            }
        }

        @Override
        public void dispatch() {
            // TODO Auto-generated method stub

        }
    }

    public enum SwitchType {
        BASIC_SWITCH,
        CORE_SWITCH
    }

    public enum LinkType {
        INVALID_LINK {
            @Override
            public String toString() {
                return "invalid";
            }
        },
        DIRECT_LINK {
            @Override
            public String toString() {
                return "internal";
            }
        },
        MULTIHOP_LINK {
            @Override
            public String toString() {
                return "external";
            }
        },
        TUNNEL {
            @Override
            public String toString() {
                return "tunnel";
            }
        }
    }
}
