package net.onrc.onos.ofcontroller.core.module;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.floodlightcontroller.core.IFloodlightProviderService;
import net.floodlightcontroller.core.module.FloodlightModuleContext;
import net.floodlightcontroller.core.module.FloodlightModuleException;
import net.floodlightcontroller.core.module.IFloodlightModule;
import net.floodlightcontroller.core.module.IFloodlightService;
import net.floodlightcontroller.restserver.IRestApiService;
import net.floodlightcontroller.topology.ITopologyService;
import net.onrc.onos.datagrid.IDatagridService;
import net.onrc.onos.ofcontroller.core.config.DefaultConfiguration;
import net.onrc.onos.ofcontroller.core.config.IConfigInfoService;
import net.onrc.onos.ofcontroller.flowmanager.IFlowService;
import net.onrc.onos.ofcontroller.forwarding.Forwarding;
import net.onrc.onos.ofcontroller.proxyarp.IProxyArpService;
import net.onrc.onos.ofcontroller.proxyarp.ProxyArpManager;

public class OnosModuleLoader implements IFloodlightModule {
	private IFloodlightProviderService floodlightProvider;
	private ITopologyService topology;
	private IConfigInfoService config;
	private IRestApiService restApi;
	private IFlowService flowService;
	private IDatagridService datagrid;

	private ProxyArpManager arpManager;
	private Forwarding forwarding;
	
	public OnosModuleLoader() {
		arpManager = new ProxyArpManager();
		forwarding = new Forwarding();
	}
	
	@Override
	public Collection<Class<? extends IFloodlightService>> getModuleServices() {
		List<Class<? extends IFloodlightService>> services = 
				new ArrayList<Class<? extends IFloodlightService>>();
		services.add(IProxyArpService.class);
		return services;
	}

	@Override
	public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
		Map<Class<? extends IFloodlightService>, IFloodlightService> impls = 
				new HashMap<Class<? extends IFloodlightService>, IFloodlightService>();
		impls.put(IProxyArpService.class, arpManager);
		return impls;
	}

	@Override
	public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
		List<Class<? extends IFloodlightService>> dependencies = 
				new ArrayList<Class<? extends IFloodlightService>>();
		dependencies.add(IFloodlightProviderService.class);
		dependencies.add(ITopologyService.class);
		dependencies.add(IRestApiService.class);
		dependencies.add(IFlowService.class);
		dependencies.add(IDatagridService.class);
		return dependencies;
	}

	@Override
	public void init(FloodlightModuleContext context)
			throws FloodlightModuleException {
		floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
		topology = context.getServiceImpl(ITopologyService.class);
		restApi = context.getServiceImpl(IRestApiService.class);
		flowService = context.getServiceImpl(IFlowService.class);
		datagrid = context.getServiceImpl(IDatagridService.class);
		
		//This could be null because it's not mandatory to have an
		//IConfigInfoService loaded.
		config = context.getServiceImpl(IConfigInfoService.class);
		if (config == null) {
			config = new DefaultConfiguration();
		}

		arpManager.init(floodlightProvider, topology, datagrid, config, restApi);
		forwarding.init(floodlightProvider, flowService, datagrid);
	}

	@Override
	public void startUp(FloodlightModuleContext context) {
		arpManager.startUp();
		forwarding.startUp();
	}

}
