package net.floodlightcontroller.core.web;

import java.util.HashMap;

import net.floodlightcontroller.core.IFloodlightProviderService;
import net.floodlightcontroller.core.IOFSwitch;

import org.openflow.util.HexString;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SwitchRoleResource extends ServerResource {

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

    @Get("json")
    public Object getRole() {
        IFloodlightProviderService floodlightProvider = 
                (IFloodlightProviderService)getContext().getAttributes().
                    get(IFloodlightProviderService.class.getCanonicalName());

        String switchId = (String) getRequestAttributes().get("switchId");
        
        RoleInfo roleInfo;
        
        if (switchId.equalsIgnoreCase("all")) {
            HashMap<String,RoleInfo> model = new HashMap<String,RoleInfo>();
            for (IOFSwitch sw: floodlightProvider.getSwitches().values()) {
            	switchId = sw.getStringId();
            	roleInfo = new RoleInfo(sw.getRole());
            	model.put(switchId, roleInfo);
            }
            return model;
        }
        
    	Long dpid = HexString.toLong(switchId);
    	IOFSwitch sw = floodlightProvider.getSwitches().get(dpid);
    	if (sw == null)
    		return null;
    	roleInfo = new RoleInfo(sw.getRole());
    	return roleInfo;
    }
}
