package net.onrc.onos.datagrid.web;

import java.util.Collection;

import net.onrc.onos.datagrid.IDatagridService;
import net.onrc.onos.ofcontroller.topology.TopologyElement;
import net.onrc.onos.ofcontroller.util.FlowEntry;
import net.onrc.onos.ofcontroller.util.FlowPath;

import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Datagrid REST API implementation: Get the state of a map.
 *
 * Valid map names:
 *  - "all"        : Get all maps
 *  - "flow"       : Get the Flows
 *  - "flow-entry" : Get the Flow Entries
 *  - "topology"   : Get the Topology
 *
 *   GET /wm/onos/datagrid/get/map/{map-name}/json
 */
public class GetMapResource extends ServerResource {
    protected final static Logger log = LoggerFactory.getLogger(GetMapResource.class);

    /**
     * Implement the API.
     *
     * @return a string with the state of the map(s).
     */
    @Get("json")
    public String retrieve() {
	String result = "";

        IDatagridService datagridService =
                (IDatagridService)getContext().getAttributes().
                get(IDatagridService.class.getCanonicalName());

        if (datagridService == null) {
	    log.debug("ONOS Datagrid Service not found");
            return result;
	}

	// Extract the arguments
	String mapNameStr = (String)getRequestAttributes().get("map-name");

	log.debug("Get Datagrid Map: {}", mapNameStr);

	//
	// Get the Flows
	//
	if (mapNameStr.equals("flow") || mapNameStr.equals("all")) {
	    Collection<FlowPath> flowPaths = datagridService.getAllFlows();
	    result += "Flows:\n";
	    for (FlowPath flowPath : flowPaths) {
		result += flowPath.toString() + "\n";
	    }
	}

	//
	// Get the Flow Entries
	//
	if (mapNameStr.equals("flow-entry") || mapNameStr.equals("all")) {
	    Collection<FlowEntry> flowEntries = datagridService.getAllFlowEntries();
	    result += "Flow Entries:\n";
	    for (FlowEntry flowEntry : flowEntries) {
		result += flowEntry.toString() + "\n";
	    }
	}

	if (mapNameStr.equals("topology") || mapNameStr.equals("all")) {
	    Collection<TopologyElement> topologyElements = datagridService.getAllTopologyElements();
	    result += "Topology:\n";
	    for (TopologyElement topologyElement : topologyElements) {
		result += topologyElement.toString() + "\n";
	    }
	}

        return result;
    }
}
