/*
 * 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.virtualbng;

import static org.slf4j.LoggerFactory.getLogger;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.Map;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onosproject.rest.AbstractWebResource;
import org.slf4j.Logger;

/**
 * REST services to interact with the virtual BNG.
 */
@Path("privateip")
public class VbngResource extends AbstractWebResource {

    private final Logger log = getLogger(getClass());

    /**
     * Create a new virtual BNG connection.
     *
     * @param privateIp IP Address for the BNG private network
     * @param mac MAC address for the host
     * @param hostName name of the host
     * @return public IP address for the new connection
     */
    @POST
    @Path("{privateip}/{mac}/{hostname}")
    public String privateIpAddNotification(@PathParam("privateip")
            String privateIp, @PathParam("mac") String mac,
            @PathParam("hostname") String hostName) {

        log.info("Received creating vBNG request, "
                + "privateIp= {}, mac={}, hostName= {}",
                 privateIp, mac, hostName);

        if (privateIp == null || mac == null || hostName == null) {
            log.info("Parameters can not be null");
            return "0";
        }

        IpAddress privateIpAddress = IpAddress.valueOf(privateIp);
        MacAddress hostMacAddress = MacAddress.valueOf(mac);

        VbngService vbngService = get(VbngService.class);

        IpAddress publicIpAddress = null;
        // Create a virtual BNG
        publicIpAddress = vbngService.createVbng(privateIpAddress,
                                                 hostMacAddress,
                                                 hostName);

        if (publicIpAddress != null) {
            return publicIpAddress.toString();
        } else {
            return "0";
        }
    }

    /**
     * Delete a virtual BNG connection.
     *
     * @param privateIp IP Address for the BNG private network
     * @return public IP address for the new connection
     */
    @DELETE
    @Path("{privateip}")
    public String privateIpDeleteNotification(@PathParam("privateip")
            String privateIp) {
        if (privateIp == null) {
            log.info("Private IP address to delete is null");
            return "0";
        }
        log.info("Received a private IP address : {} to delete", privateIp);
        IpAddress privateIpAddress = IpAddress.valueOf(privateIp);

        VbngService vbngService = get(VbngService.class);

        IpAddress assignedPublicIpAddress = null;
        // Delete a virtual BNG
        assignedPublicIpAddress = vbngService.deleteVbng(privateIpAddress);

        if (assignedPublicIpAddress != null) {
            return assignedPublicIpAddress.toString();
        } else {
            return "0";
        }
    }

    /**
     * Query virtual BNG map.
     *
     * @return IP Address map
     */
    @GET
    @Path("map")
    @Produces(MediaType.APPLICATION_JSON)
    public Response privateIpDeleteNotification() {

        log.info("Received vBNG IP address map request");

        VbngConfigurationService vbngConfigurationService =
                get(VbngConfigurationService.class);

        Map<IpAddress, IpAddress> map =
                vbngConfigurationService.getIpAddressMappings();
        ObjectNode result = new ObjectMapper().createObjectNode();

        result.set("map", new IpAddressMapEntryCodec().encode(map.entrySet(), this));

        return ok(result.toString()).build();
    }
}
