package io.s4.core;

import java.io.File;
import java.net.URL;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Level;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;

/**
 * The Server instance coordinates activities in a cluster node including
 * loading and unloading of applications and instantiating the communication
 * layer.
 */
class Server {

    final private String moduleName;
    final private String logLevel;

    /**
     * 
     */
    @Inject
    public Server(@Named("comm.module") String moduleName,
            @Named("s4.logger_level") String logLevel) {
        this.moduleName = moduleName;
        this.logLevel = logLevel;
    }

    private static final Logger logger = LoggerFactory.getLogger(Server.class);

    public void start() throws Exception {

        /* Set up logger basic configuration. */
        ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory
                .getLogger(Logger.ROOT_LOGGER_NAME);
        root.setLevel(Level.toLevel(logLevel));

        Injector injector;
        AbstractModule module = null;

        /* Initialize communication layer module. */
        try {
            module = (AbstractModule) Class.forName(moduleName).newInstance();
        } catch (Exception e) {
            logger.error("Unable to instantiate communication layer module.", e);
        }

        /* After some indirection we get the injector. */
        injector = Guice.createInjector(module);

        // HERE WE SHOULD LOOP TO CHECK IF WE NEED TO LOAD OR UNLOAD APPS.

        logger.trace("Load HelloApp");

        /* The root dir for the modules is called "modules". */
        File repoRoot = new File(getClass().getClassLoader()
                .getResource("modules").toURI());

        /* Create a module loader using the root. */
        // ModuleLoader moduleLoader = new LocalModuleLoader(new File[]
        // {repoRoot});

        /* Load teh module and run! */
        // moduleLoader.loadModule(ModuleIdentifier.fromString("helloapp")).run(new
        // String[] {});

        // org.jboss.modules.Module mod =
        // moduleLoader.loadModule(ModuleIdentifier.fromString("modules.helloapp"));
        // System.out.println(mod.toString());
        // System.out.println(mod.getClassLoader().toString());
        // mod.run(new String[] {});

        // /*
        // * Create the Event Generator objects using injection. The generators
        // * will be serialized and sent to remote hosts.
        // */
        // List<EventGenerator> generators = injector.getInstance(Key
        // .get(new TypeLiteral<List<EventGenerator>>() {
        // }));
        //
        // /*
        // * The communicator interface hides the implementation details of how
        // * the EventGenerator instance is sent to remote hosts.
        // */
        // Communicator comm = injector.getInstance(Communicator.class);

    }
}
