/*
 * Copyright 2017-present 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.l3vpn.netl3vpn.impl;

import org.onosproject.l3vpn.netl3vpn.AccessInfo;
import org.onosproject.l3vpn.netl3vpn.BgpDriverInfo;
import org.onosproject.l3vpn.netl3vpn.BgpInfo;
import org.onosproject.l3vpn.netl3vpn.InterfaceInfo;
import org.onosproject.l3vpn.netl3vpn.NetL3VpnException;
import org.onosproject.l3vpn.netl3vpn.VpnType;
import org.onosproject.net.DeviceId;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.Interfaces;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.l3vpn.svc.rev20160730.ietfl3vpnsvc.DefaultL3VpnSvc;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.l3vpn.svc.rev20160730.ietfl3vpnsvc.SiteRole;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.l3vpn.svc.rev20160730.ietfl3vpnsvc.l3vpnsvc.DefaultSites;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.DefaultDevices;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.Devices;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.DefaultDevice;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.Device;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.DeviceKeys;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.NetworkInstances;
import org.onosproject.yang.model.DataNode;
import org.onosproject.yang.model.DefaultModelObjectData;
import org.onosproject.yang.model.InnerModelObject;
import org.onosproject.yang.model.ModelObjectData;
import org.onosproject.yang.model.ModelObjectId;
import org.onosproject.yang.model.ResourceData;
import org.onosproject.yang.model.ResourceId;
import org.onosproject.yang.runtime.DefaultResourceData;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import static org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel.DEVICE;
import static org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel.DEVICES;
import static org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel.ROOT;
import static org.onosproject.l3vpn.netl3vpn.VpnType.ANY_TO_ANY;
import static org.onosproject.l3vpn.netl3vpn.VpnType.HUB;
import static org.onosproject.l3vpn.netl3vpn.VpnType.SPOKE;

/**
 * Representation of utility for YANG tree builder.
 */
public final class NetL3VpnUtil {

    /**
     * Error message for unsupported event from config store.
     */
    static final String EVENT_NOT_SUPPORTED = "Unsupported config event has " +
            "come";

    /**
     * Error message for site VPN name being not present in global VPN.
     */
    static final String SITE_VPN_MISMATCH = "Site VPN instance name did not " +
            "match any of the global VPN names";

    /**
     * Error message for VPN attachment object being null.
     */
    static final String VPN_ATTACHMENT_NULL = "The VPN attachment information" +
            " cannot be null";

    /**
     * Error message for VPN policy being not supported.
     */
    static final String VPN_POLICY_NOT_SUPPORTED = "VPN policy implementation" +
            " is not supported.";

    /**
     * Static constant value for hundred.
     */
    static final String CONS_HUNDRED = "100:";

    /**
     * Error message for site role being not present in site network access.
     */
    static final String SITE_ROLE_NULL = "There must be a site role available" +
            " for the VPN in site network access.";

    /**
     * Error message for bearer object information being null.
     */
    static final String BEARER_NULL = "The bearer information of the access " +
            "is not available";

    /**
     * Error message for requested type or ip connect being null.
     */
    static final String IP_INT_INFO_NULL = "The required information of " +
            "request type or ip connection is not available";

    /**
     * Error message for device info being not available from augment.
     */
    static final String DEVICE_INFO_NULL = "Bearer of site does not have any " +
            "device information in the augment info.";

    /**
     * Static constant value for management address.
     */
    static final String MG_MT_ADD = "managementAddress";

    /**
     * Error message for VPN type being not supported.
     */
    static final String VPN_TYPE_UNSUPPORTED = "The VPN type is not supported";

    /**
     * Error message when the generated ID has crossed the limit.
     */
    static final String ID_LIMIT_EXCEEDED = "The ID generation has got " +
            "exceeded";

    /**
     * Static constant value ID management limit.
     */
    static final Long ID_LIMIT = 4294967295L;

    /**
     * Error message for interface information being not available.
     */
    static final String INT_INFO_NULL = "Requested type does not have any " +
            "interface information in the augment info.";

    /**
     * Static constant value of port name.
     */
    static final String PORT_NAME = "portName";

    private static final String SITE_ROLE_INVALID = "The given site role is " +
            "invalid";
    private static final String ANY_TO_ANY_ROLE = "AnyToAnyRole";
    private static final String HUB_ROLE = "HubRole";
    private static final String SPOKE_ROLE = "SpokeRole";

    // No instantiation.
    private NetL3VpnUtil() {
    }

    /**
     * Returns the model object id for service L3VPN container.
     *
     * @return model object id
     */
    static ModelObjectId getModIdForL3VpnSvc() {
        return ModelObjectId.builder().addChild(DefaultL3VpnSvc.class).build();
    }

    /**
     * Returns the model object id for service sites container.
     *
     * @return model object id
     */
    static ModelObjectId getModIdForSites() {
        return ModelObjectId.builder().addChild(DefaultL3VpnSvc.class)
                .addChild(DefaultSites.class).build();
    }

    /**
     * Returns the resource data from the data node and the resource id.
     *
     * @param dataNode data node
     * @param resId    resource id
     * @return resource data
     */
    static ResourceData getResourceData(DataNode dataNode, ResourceId resId) {
        return DefaultResourceData.builder().addDataNode(dataNode)
                .resourceId(resId).build();
    }

    /**
     * Returns the VPN role from the service site role.
     *
     * @param siteRole service site role
     * @return VPN type
     */
    static VpnType getRole(Class<? extends SiteRole> siteRole) {
        switch (siteRole.getSimpleName()) {
            case ANY_TO_ANY_ROLE:
                return ANY_TO_ANY;

            case HUB_ROLE:
                return HUB;

            case SPOKE_ROLE:
                return SPOKE;

            default:
                throw new NetL3VpnException(SITE_ROLE_INVALID);
        }
    }

    /**
     * Returns error message for management ip being unavailable in device.
     *
     * @param ip management ip
     * @return error message
     */
    static String getMgmtIpUnAvailErr(String ip) {
        return "The device with management ip " + ip + " is not available.";
    }

    /**
     * Returns true if device id present in the interface map; false otherwise.
     *
     * @param info interface map
     * @param id   device id
     * @return true if device id available; false otherwise
     */
    private static boolean isDevIdPresent(Map<AccessInfo, InterfaceInfo> info,
                                          String id) {
        for (Map.Entry<AccessInfo, InterfaceInfo> inter : info.entrySet()) {
            InterfaceInfo interfaceInfo = inter.getValue();
            DeviceId devId = interfaceInfo.devInfo().deviceId();
            if (devId.toString().equals(id)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Builds the device model VPN instance model object data, with respect to
     * the device level.
     *
     * @param id  device id
     * @param ins VPN instance
     * @return model object data, with device level
     */
    private static ModelObjectData buildInsModDataDevice(String id,
                                                         NetworkInstances ins) {
        DeviceKeys devKeys = new DeviceKeys();
        devKeys.deviceid(id);
        ModelObjectId modelId = ModelObjectId.builder()
                .addChild(DefaultDevices.class)
                .addChild(DefaultDevice.class, devKeys)
                .build();
        return DefaultModelObjectData.builder().identifer(modelId)
                .addModelObject((InnerModelObject) ins).build();
    }

    /**
     * Builds the device model VPN instance model object data, with respect to
     * the devices level.
     *
     * @param id  device id
     * @param ins VPN instance
     * @return model object data, with devices level
     */
    private static ModelObjectData buildInsModDataDevices(String id,
                                                          NetworkInstances ins) {
        ModelObjectId modelId = ModelObjectId.builder()
                .addChild(DefaultDevices.class).build();
        Device device = new DefaultDevice();
        device.deviceid(id);
        device.networkInstances(ins);
        return DefaultModelObjectData.builder().identifer(modelId)
                .addModelObject((InnerModelObject) device).build();
    }

    /**
     * Builds the device model VPN instance model object data, with respect to
     * root level.
     *
     * @param id  device id
     * @param ins VPN instance
     * @return model object data, with root level
     */
    private static ModelObjectData buildInsModDataRoot(String id,
                                                       NetworkInstances ins) {
        Devices devices = new DefaultDevices();
        Device device = new DefaultDevice();
        List<Device> deviceList = new LinkedList<>();
        device.deviceid(id);
        device.networkInstances(ins);
        deviceList.add(device);
        devices.device(deviceList);
        return DefaultModelObjectData.builder()
                .addModelObject((InnerModelObject) devices).build();
    }

    /**
     * Builds the device model interface model object data, with respect to
     * device level.
     *
     * @param id  device id
     * @param ifs interface object
     * @return model object data, with device level
     */
    private static ModelObjectData buildIntModDataDevice(String id,
                                                         Interfaces ifs) {
        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
                .rev20140508.ietfinterfaces.devices.DeviceKeys keys =
                new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
                        .ietf.interfaces.rev20140508.ietfinterfaces.devices
                        .DeviceKeys();
        keys.deviceid(id);
        ModelObjectId modelId = ModelObjectId.builder()
                .addChild(org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns
                                  .yang.ietf.interfaces.rev20140508
                                  .ietfinterfaces.DefaultDevices.class)
                .addChild(org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns
                                  .yang.ietf.interfaces.rev20140508
                                  .ietfinterfaces.devices.DefaultDevice.class,
                          keys)
                .build();
        return DefaultModelObjectData.builder().identifer(modelId)
                .addModelObject((InnerModelObject) ifs).build();
    }

    /**
     * Returns the VPN instance create model object data.
     *
     * @param intMap    interface map
     * @param instances VPN instances
     * @param id        device id
     * @return VPN instance model object data
     */
    static ModelObjectData getVpnCreateModObj(Map<AccessInfo, InterfaceInfo> intMap,
                                              NetworkInstances instances,
                                              String id) {
        ModelObjectData modData;
        boolean devAdded = isDevIdPresent(intMap, id);
        if (devAdded) {
            modData = buildInsModDataDevice(id, instances);
        } else if (intMap.size() != 0) {
            modData = buildInsModDataDevices(id, instances);
        } else {
            modData = buildInsModDataRoot(id, instances);
        }
        return modData;
    }

    /**
     * Returns error message for interface being unavailable in device.
     *
     * @param intName interface name
     * @return error message
     */
    static String getIntNotAvailable(String intName) {
        return "The interface " + intName + " is not available.";
    }

    /**
     * Returns the interface create model object data.
     *
     * @param intMap interface map
     * @param ifs    interface instance
     * @param id     device id
     * @return interface model object data
     */
    static ModelObjectData getIntCreateModObj(Map<AccessInfo, InterfaceInfo> intMap,
                                              Interfaces ifs, String id) {
        ModelObjectData modData;
        boolean intAdded = isDevIdPresent(intMap, id);
        if (intAdded) {
            modData = buildIntModDataDevice(id, ifs);
        } else {
            modData = buildIntModDataRoot(id, ifs);
        }
        return modData;
    }

    /**
     * Builds the device model interface model object data, with respect to
     * root level.
     *
     * @param id  device id
     * @param ifs interface object
     * @return model object data, with root level
     */
    private static ModelObjectData buildIntModDataRoot(String id,
                                                       Interfaces ifs) {
        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
                .rev20140508.ietfinterfaces.Devices devices =
                new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
                        .ietf.interfaces.rev20140508.ietfinterfaces
                        .DefaultDevices();
        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
                .rev20140508.ietfinterfaces.devices.Device device =
                new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
                        .ietf.interfaces.rev20140508.ietfinterfaces.devices
                        .DefaultDevice();
        List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
                .interfaces.rev20140508.ietfinterfaces.devices
                .Device> deviceList = new LinkedList<>();

        device.deviceid(id);
        device.interfaces(ifs);
        deviceList.add(device);
        devices.device(deviceList);
        return DefaultModelObjectData.builder()
                .addModelObject((InnerModelObject) devices).build();
    }

    /**
     * Returns the BGP create driver info.
     *
     * @param bgpMap BGP map
     * @param id     device id
     * @return driver config info
     */
    static BgpDriverInfo getBgpCreateConfigObj(Map<BgpInfo, DeviceId> bgpMap,
                                               String id) {
        boolean isDevIdPresent = isDevIdBgpPresent(bgpMap, id);
        BgpDriverInfo info;
        if (isDevIdPresent) {
            info = new BgpDriverInfo(DEVICE, id);

        } else if (bgpMap.size() != 0) {
            info = new BgpDriverInfo(DEVICES, id);
        } else {
            info = new BgpDriverInfo(ROOT, id);
        }
        return info;
    }

    /**
     * Returns true if the device is present in the BGP map; false otherwise.
     *
     * @param bgpMap BGP map
     * @param id     device id
     * @return true if device is present; false otherwise
     */
    private static boolean isDevIdBgpPresent(Map<BgpInfo, DeviceId> bgpMap,
                                             String id) {
        for (Map.Entry<BgpInfo, DeviceId> info : bgpMap.entrySet()) {
            DeviceId devId = info.getValue();
            if (devId.toString().equals(id)) {
                return true;
            }
        }
        return false;
    }
}
