/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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 org.onosproject.segmentrouting.config;

import org.onosproject.net.DeviceId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * NetworkConfigExceptions specifies a set of unchecked runtime exceptions that
 * can be thrown by the {@link NetworkConfigManager}. It indicates errors that
 * must be fixed in the config file before controller execution can proceed.
 */
public class NetworkConfigException extends RuntimeException {

    private static final long serialVersionUID = 4959684709803000652L;
    protected static final Logger log = LoggerFactory
            .getLogger(NetworkConfigException.class);

    /**
     * Exception for duplicate device identifier configuration.
     */
    public static class DuplicateDpid extends RuntimeException {
        private static final long serialVersionUID = 5491113234592145335L;

        public DuplicateDpid(DeviceId dpid) {
            super();
            log.error("Duplicate dpid found in switch-config Dpid:{}",
                    dpid);
        }
    }

    /**
     * Exception for duplicate device name configuration.
     */
    public static class DuplicateName extends RuntimeException {
        private static final long serialVersionUID = -4090171438031376129L;

        public DuplicateName(String name) {
            super();
            log.error("Duplicate name found in switch-config name:{}", name);
        }
    }

    /**
     * Exception for unspecified device identifier for a switch.
     */
    public static class DpidNotSpecified extends RuntimeException {
        private static final long serialVersionUID = -8494418855597117254L;

        public DpidNotSpecified(String name) {
            super();
            log.error("Dpid not specified for switch-config name:{}", name);
        }
    }

    /**
     * Exception for unspecified device name for a switch.
     */
    public static class NameNotSpecified extends RuntimeException {
        private static final long serialVersionUID = -3518881744110422891L;

        public NameNotSpecified(DeviceId dpid) {
            super();
            log.error("Name not specified for switch-config dpid:{}",
                    dpid);
        }
    }

    /**
     * Exception for unspecified device type for a switch.
     */
    public static class SwitchTypeNotSpecified extends RuntimeException {
        private static final long serialVersionUID = 2527453336226053753L;

        public SwitchTypeNotSpecified(DeviceId dpid) {
            super();
            log.error("Switch type not specified for switch-config dpid:{}",
                    dpid);
        }
    }

    /**
     * Exception for unknown device type configured for a switch.
     */
    public static class UnknownSwitchType extends RuntimeException {
        private static final long serialVersionUID = 7758418165512249170L;

        public UnknownSwitchType(String type, String name) {
            super();
            log.error("Unknown switch type {} for switch name:{}", type, name);
        }
    }

    /**
     * Exception for missing required parameter configuration for a switch.
     */
    public static class ParamsNotSpecified extends RuntimeException {
        private static final long serialVersionUID = 6247582323691265513L;

        public ParamsNotSpecified(String name) {
            super();
            log.error("Params required - not specified for switch:{}", name);
        }
    }

    /**
     * Reserved for future use.
     */
    public static class LinkTypeNotSpecified extends RuntimeException {
        private static final long serialVersionUID = -2089470389588542215L;

        public LinkTypeNotSpecified(String dpid1, String dpid2) {
            super();
            log.error("Link type not specified for link-config between "
                    + "dpid1:{} and dpid2:{}", dpid1, dpid2);
        }
    }

    /**
     * Reserved for future use.
     */
    public static class LinkDpidNotSpecified extends RuntimeException {
        private static final long serialVersionUID = -5701825916378616004L;

        public LinkDpidNotSpecified(String dpid1, String dpid2) {
            super();
            if (dpid1 == null) {
                log.error("nodeDpid1 not specified for link-config ");
            }
            if (dpid2 == null) {
                log.error("nodeDpid2 not specified for link-config ");
            }
        }
    }

    /**
     * Reserved for future use.
     */
    public static class LinkForUnknownSwitchConfig extends RuntimeException {
        private static final long serialVersionUID = -2910458439881964094L;

        public LinkForUnknownSwitchConfig(String dpid) {
            super();
            log.error("Link configuration was specified for a switch-dpid {} "
                    + "that has not been configured", dpid);
        }
    }

    /**
     * Reserved for future use.
     */
    public static class UnknownLinkType extends RuntimeException {
        private static final long serialVersionUID = -5505376193106542305L;

        public UnknownLinkType(String linktype, String dpid1, String dpid2) {
            super();
            log.error("unknown link type {} for links between dpid1:{} "
                    + "and dpid2:{}", linktype, dpid1, dpid2);
        }
    }

    /**
     * Exception for generic configuration errors.
     */
    public static class ErrorConfig extends RuntimeException {
        private static final long serialVersionUID = -2827406314700193147L;

        public ErrorConfig(String errorMsg) {
            super();
            log.error(errorMsg);
        }

    }

    /**
     * Reserved for future use.
     */
    public static class SwitchDpidNotConverted extends RuntimeException {
        private static final long serialVersionUID = 5640347104590170426L;

        public SwitchDpidNotConverted(String name) {
            super();
            log.error("Switch dpid specified as a HexString {} does not match "
                    + "with long value", name);
        }
    }

    /**
     * Reserved for future use.
     */
    public static class LinkDpidNotConverted extends RuntimeException {
        private static final long serialVersionUID = 2397245646094080774L;

        public LinkDpidNotConverted(String dpid1, String dpid2) {
            log.error("Dpids expressed as HexStrings for links between dpid1:{} "
                    + "and dpid2:{} do not match with long values", dpid1, dpid2);
        }
    }

}

