/*******************************************************************************
 * Copyright (c) 2010 Angelo Zerr and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Angelo Zerr <angelo.zerr@gmail.com> - Initial API and implementation 
 *******************************************************************************/
package org.eclipse.jst.server.jetty.core.internal;

import static java.text.MessageFormat.format;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IFolder;
import org.eclipse.jst.server.jetty.core.IJettyConfiguration;
import org.eclipse.jst.server.jetty.core.internal.jetty7.Jetty7Provider;
import org.eclipse.jst.server.jetty.core.internal.jetty8.Jetty8Provider;

public class JettyVersionManager
{

    public static final JettyVersionManager __INSTANCE = new JettyVersionManager();

    private Map<String, IJettyVersionProvider> _versionProviders = new HashMap<String, IJettyVersionProvider>();

    private List<String> _runtimeTypes = new ArrayList<String>();

    public enum JettyVersion
    {
        V71, V72, V73, V74, V75, V76, V80, V81
    }

    private JettyVersionManager()
    {
        register(JettyVersion.V71, Jetty7Provider.__INSTANCE);
        register(JettyVersion.V72, Jetty7Provider.__INSTANCE);
        register(JettyVersion.V73, Jetty7Provider.__INSTANCE);
        register(JettyVersion.V74, Jetty7Provider.__INSTANCE);
        register(JettyVersion.V75, Jetty7Provider.__INSTANCE);
        register(JettyVersion.V76, Jetty7Provider.__INSTANCE);
        register(JettyVersion.V80, Jetty8Provider.__INSTANCE);
        register(JettyVersion.V81, Jetty8Provider.__INSTANCE);
    }

    public void register(JettyVersion version, IJettyVersionProvider versionProvider)
    {
        _versionProviders.put(version.name(),versionProvider);

        String versionNumber = version.name().substring(1,version.name().length());
        
        _runtimeTypes.add("org.eclipse.jst.server.jetty.runtime." + versionNumber);
    }

    public IJettyVersionHandler getJettyVersionHandler(String id)
    {
        String version = getVersion(id);
        IJettyVersionProvider versionProvider = _versionProviders.get(version);
        if (versionProvider == null)
        {
            throw new JettyVersionHandlerNotFoundException(version);
        }
        return versionProvider.getJettyVersionHandler();
    }

    public IJettyConfiguration getJettyConfiguration(String id, IFolder path)
    {
        String version = getVersion(id);
        IJettyVersionProvider versionProvider = _versionProviders.get(version);
        if (versionProvider == null)
        {
            throw new JettyVersionHandlerNotFoundException(version);
        }
        return versionProvider.createJettyConfiguration(path);
    }

    private String getVersion(String id)
    {
        String version = id;
        
        int index = version.lastIndexOf('.');
        
        if (index != -1)
        {
            version = version.substring(index + 1,version.length());
        }
        
        if (!version.startsWith("v"))
        {
            version = "v" + version;
        }
        
        version = version.toUpperCase();
        return version;
    }

    private static class JettyVersionHandlerNotFoundException extends RuntimeException
    {
        private static final long serialVersionUID = 1L;

        private static final String MESSAGE = "Version Handler not founded with serverType={0}.";

        public JettyVersionHandlerNotFoundException(String serverType)
        {
            super(format(MESSAGE,serverType));
        }
    }

    public Collection<String> getRuntimeTypes()
    {
        return _runtimeTypes;
    }

}
