package net.onrc.onos.apps.bgproute;


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


public class BgpRouteResourceSynch extends ServerResource {

    protected final static Logger log = LoggerFactory
            .getLogger(BgpRouteResource.class);

    @Post
    public String store(String fmJson) {

        IBgpRouteService bgpRoute = (IBgpRouteService) getContext().getAttributes().
                get(IBgpRouteService.class.getCanonicalName());

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

        try {

            String BGPdRestIp = bgpRoute.getBGPdRestIp();

            //bgpdRestIp includes port number, such as 1.1.1.1:8080
            RestClient.post("http://" + BGPdRestIp + "/wm/bgp/" + router_id + "/" + prefix + "/" + mask + "/" + nexthop);
        } catch (Exception e) {
            e.printStackTrace();
        }

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

        return reply + "\n";


    }

    @Delete
    public String delete(String fmJson) {
        IBgpRouteService bgpRoute = (IBgpRouteService) getContext().getAttributes().
                get(IBgpRouteService.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 reply = "";
        try {
            String BGPdRestIp = bgpRoute.getBGPdRestIp();

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

        } catch (Exception e) {
            e.printStackTrace();
        }

        reply = reply + "[DELE: " + prefix + "/" + mask + ":" + nextHop + "/synch]";

        log.info(reply);


        return reply + "\n";
    }
}
