package net.onrc.onos.apps.sdnip.web;

import net.onrc.onos.apps.sdnip.ISdnIpService;
import net.onrc.onos.apps.sdnip.RestClient;

import org.restlet.resource.Delete;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * REST handler for sending commands to SDN-IP. This interface is intended for
 * operators or developers to change the route table of BGPd. There are
 * interfaces for both sending new routes and deleting routes. This is
 * not intended to be used during general operation. It is to have a way to
 * influence BGPd's behavior for debugging.
 */
public class OutgoingRequestResource extends ServerResource {
    private static final Logger log = LoggerFactory.getLogger(OutgoingRequestResource.class);

    /**
     * Handles a REST call to SDN-IP which gives a command to send a new route
     * to BGPd.
     *
     * @return a String describing the result of the operation
     */
    @Post
    public String handlePostMethod() {

        ISdnIpService sdnIp = (ISdnIpService) getContext().getAttributes().
                get(ISdnIpService.class.getCanonicalName());

        String routerId = (String) getRequestAttributes().get("routerid");
        String prefix = (String) getRequestAttributes().get("prefix");
        String mask = (String) getRequestAttributes().get("mask");
        String nexthop = (String) getRequestAttributes().get("nexthop");

        String bgpdRestIp = sdnIp.getBgpdRestIp();

        // bgpdRestIp includes port number, e.g. 1.1.1.1:8080
        RestClient.post("http://" + bgpdRestIp + "/wm/bgp/" + routerId + "/" + prefix + "/"
                + mask + "/" + nexthop);

        String reply = "";
        reply = "[POST: " + prefix + "/" + mask + ":" + nexthop + "/synch]";
        log.info(reply);

        return reply + "\n";

    }

    /**
     * Handles a REST call to SDN-IP which gives a command to BGPd to delete a
     * route from its route table.
     *
     * @return a String description of the result of the operation
     */
    @Delete
    public String handleDeleteMethod() {
        ISdnIpService sdnIp = (ISdnIpService) getContext().getAttributes().
                get(ISdnIpService.class.getCanonicalName());

        String routerId = (String) getRequestAttributes().get("routerid");
        String prefix = (String) getRequestAttributes().get("prefix");
        String mask = (String) getRequestAttributes().get("mask");
        String nextHop = (String) getRequestAttributes().get("nexthop");

        StringBuilder reply = new StringBuilder();

        String bgpdRestIp = sdnIp.getBgpdRestIp();

        RestClient.delete("http://" + bgpdRestIp + "/wm/bgp/" + routerId + "/" + prefix + "/"
                + mask + "/" + nextHop);

        reply.append("[DELE: ")
             .append(prefix)
             .append('/')
             .append(mask)
             .append(':')
             .append(nextHop)
             .append("/synch]");

        log.info(reply.toString());

        return reply.append("\n").toString();
    }
}
