/******************************************************************************
 * Copyright (c) 2008 Oracle
 * 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:
 *    Konstantin Komissarchik - initial implementation and ongoing maintenance
 ******************************************************************************/

package org.eclipse.wst.common.project.facet.ui.internal;

import static org.eclipse.wst.common.project.facet.core.util.internal.PluginUtil.findExtensions;
import static org.eclipse.wst.common.project.facet.core.util.internal.PluginUtil.getTopLevelElements;
import static org.eclipse.wst.common.project.facet.ui.internal.FacetUiPlugin.PLUGIN_ID;

import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.project.facet.core.IActionDefinition;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
import org.eclipse.wst.common.project.facet.core.internal.ProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentType;
import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
import org.eclipse.wst.common.project.facet.ui.IFacetWizardPage;
import org.osgi.framework.Bundle;

/**
 * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
 */

public final class ProjectFacetsUiManagerImpl 
{
    private static final String WIZARD_PAGES_EXTENSION_ID = "wizardPages"; //$NON-NLS-1$
    private static final String WIZARD_PAGES_EXTENSION_ID_OLD = "wizard"; //$NON-NLS-1$
    private static final String IMAGES_EXTENSION_ID = "images"; //$NON-NLS-1$
    
    private static final String EL_WIZARD_PAGES = "wizard-pages"; //$NON-NLS-1$
    private static final String EL_PAGE = "page"; //$NON-NLS-1$
    private static final String EL_IMAGE = "image"; //$NON-NLS-1$
    private static final String ATTR_PATH = "path"; //$NON-NLS-1$
    private static final String ATTR_RUNTIME_COMPONENT_TYPE = "runtime-component-type"; //$NON-NLS-1$
    private static final String ATTR_CATEGORY = "category"; //$NON-NLS-1$
    private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
    private static final String ATTR_VERSION = "version"; //$NON-NLS-1$
    private static final String ATTR_FACET = "facet"; //$NON-NLS-1$
    private static final String ATTR_ACTION = "action"; //$NON-NLS-1$

    private static final Map<String,WizardPagesInfo> wizardPages;
    
    /**
     * Maps either IProjectFacet or IRuntimeComponentType to an ImageDescriptor.
     */
    
    private static final Map<Object,ImageDescriptor> icons = new HashMap<Object,ImageDescriptor>();
    private static ImageDescriptor defaultIcon;
    
    static
    {
        // Make sure that the core extensions are loaded first.
        
        ProjectFacetsManager.getProjectFacets();
        RuntimeManager.getRuntimeComponentTypes();
        
        wizardPages = new HashMap<String,WizardPagesInfo>();
        
        final Bundle bundle = Platform.getBundle( FacetUiPlugin.PLUGIN_ID );
        final URL url = bundle.getEntry( "images/unknown.gif" ); //$NON-NLS-1$
        defaultIcon = ImageDescriptor.createFromURL( url );
        
        readWizardPagesExtensions();
        readWizardPagesExtensionsOld();
        readImagesExtensions();
    }
    
    private ProjectFacetsUiManagerImpl() {}
    
    public static ImageDescriptor getIcon( final Object obj )
    {
        final ImageDescriptor imgdesc = icons.get( obj );
        return imgdesc != null ? imgdesc : defaultIcon;
    }
    
    public static List<IFacetWizardPage> getWizardPages( final String actionId )
    {
        final WizardPagesInfo info = wizardPages.get( actionId );
        
        if( info != null )
        {
            return getWizardPages( info.plugin, info.pages );
        }
        
        return Collections.emptyList();
    }

    /**
     * @return (element type: {@link IFacetWizardPage})
     * @deprecated
     */
    
    @SuppressWarnings( "unchecked" )
    public static List getWizardPages( final Action.Type actionType,
                                       final IProjectFacetVersion fv )
    {
        if( fv.supports( actionType ) )
        {
            try
            {
                final IActionDefinition def = ( (ProjectFacetVersion) fv ).getActionDefinition( actionType );
                return getWizardPages( def.getId() );
            }
            catch( CoreException e )
            {
                FacetUiPlugin.log( e );
            }
        }

        return Collections.EMPTY_LIST;
    }

    private static List<IFacetWizardPage> getWizardPages( final String plugin,
                                                          final List<String> clnames )
    {
        final List<IFacetWizardPage> pages = new ArrayList<IFacetWizardPage>();
        
        for( String clname : clnames )
        {
            try
            {
                pages.add( (IFacetWizardPage) create( plugin, clname ) );
            }
            catch( CoreException e )
            {
                FacetUiPlugin.log( e );
            }
        }
        
        return pages;
    }
    
    private static Object create( final String plugin,
                                  final String clname )
    
        throws CoreException
        
    {
        final Bundle bundle = Platform.getBundle( plugin );
        
        try
        {
            final Class<?> cl = bundle.loadClass( clname );
            return cl.newInstance();
        }
        catch( Exception e )
        {
            final String msg
                = NLS.bind( Resources.failedToCreate, clname );
            
            final IStatus st = FacetUiPlugin.createErrorStatus( msg, e );
            
            throw new CoreException( st );
        }
    }
    
    private static void readWizardPagesExtensions()
    {
        for( IConfigurationElement config
             : getTopLevelElements( findExtensions( PLUGIN_ID, WIZARD_PAGES_EXTENSION_ID ) ) )
        {
            final String ename = config.getName();
            
            if( ename.equals( EL_WIZARD_PAGES ) )
            {
                final String action = config.getAttribute( ATTR_ACTION );

                if( action == null )
                {
                    reportMissingAttribute( config, ATTR_ACTION );
                    return;
                }
                
                final String pluginId = config.getContributor().getName();
                
                if( ProjectFacetsManager.isActionDefined( action ) )
                {
                    final WizardPagesInfo pagesInfo = new WizardPagesInfo();
                    
                    pagesInfo.plugin = pluginId;
                    pagesInfo.pages = readPageList( config );
                    
                    wizardPages.put( action, pagesInfo );
                }
                else
                {
                    final String msg = NLS.bind( Resources.actionNotDefined, pluginId, action );
                    FacetUiPlugin.logError( msg );
                }
            }
        }
    }
    
    private static void readWizardPagesExtensionsOld()
    {
        for( IConfigurationElement config
            : getTopLevelElements( findExtensions( PLUGIN_ID, WIZARD_PAGES_EXTENSION_ID_OLD ) ) )
        {
            final String ename = config.getName();
            
            if( ename.equals( EL_WIZARD_PAGES ) )
            {
                readWizardPagesOld( config );
            }
        }
    }
    
    @SuppressWarnings( "deprecation" )
    private static void readWizardPagesOld( final IConfigurationElement config )
    {
        final String pluginId = config.getContributor().getName();

        final String depMsg 
            = NLS.bind( Resources.wizardExtensionPointDeprecated, pluginId );
        
        FacetUiPlugin.logWarning( depMsg, true );
        
        final String id = config.getAttribute( ATTR_FACET );

        if( id == null )
        {
            reportMissingAttribute( config, ATTR_FACET );
            return;
        }
        
        if( ! ProjectFacetsManager.isProjectFacetDefined( id ) )
        {
            final String msg
                = NLS.bind( Resources.facetNotDefined, 
                            config.getContributor().getName(), id );
            
            FacetUiPlugin.log( msg );
            
            return;
        }
        
        final IProjectFacet f = ProjectFacetsManager.getProjectFacet( id );

        final String version = config.getAttribute( ATTR_VERSION );

        if( version == null )
        {
            reportMissingAttribute( config, ATTR_VERSION );
            return;
        }
        
        if( ! f.hasVersion( version ) )
        {
            final String[] params
                = new String[] { config.getContributor().getName(), id, 
                                 version };
            
            final String msg
                = NLS.bind( Resources.facetVersionNotDefined, 
                            params ); 
            
            FacetUiPlugin.log( msg );
            
            return;
        }
        
        final IProjectFacetVersion fv = f.getVersion( version );
        final IConfigurationElement[] children = config.getChildren();
        
        for( int i = 0; i < children.length; i++ )
        {
            final IConfigurationElement child = children[ i ];
            final String childName = child.getName();
            final Action.Type actionType = Action.Type.valueOf( childName );
            
            if( actionType == null )
            {
                final String msg
                    = NLS.bind( Resources.invalidActionType, 
                                config.getContributor().getName(), childName );
                
                FacetUiPlugin.log( msg );
                
                return;
            }
            
            if( fv.supports( actionType ) )
            {
                final IActionDefinition def;
                
                try
                {
                    def = ( (ProjectFacetVersion) fv ).getActionDefinition( actionType );
                }
                catch( CoreException e )
                {
                    FacetUiPlugin.log( e );
                    return;
                }
                
                final WizardPagesInfo pagesInfo = new WizardPagesInfo();
                
                pagesInfo.plugin = pluginId;
                pagesInfo.pages = readPageList( child );
                
                wizardPages.put( def.getId(), pagesInfo );
            }
        }
    }

    private static List<String> readPageList( final IConfigurationElement config )
    {
        final List<String> list = new ArrayList<String>();
        final IConfigurationElement[] children = config.getChildren();
        
        for( int i = 0; i < children.length; i++ )
        {
            final IConfigurationElement child = children[ i ];
            final String childName = child.getName();
            
            if( childName.equals( EL_PAGE ) )
            {
                final String clname = child.getAttribute( ATTR_CLASS );
                
                if( clname == null )
                {
                    reportMissingAttribute( config, ATTR_CLASS );
                    continue;
                }
                
                list.add( clname );
            }
        }
        
        return list;
    }
    
    private static void readImagesExtensions()
    {
        for( IConfigurationElement config
            : getTopLevelElements( findExtensions( PLUGIN_ID, IMAGES_EXTENSION_ID ) ) )
        {
            final String ename = config.getName();
            
            if( ename.equals( EL_IMAGE ) )
            {
                final String fid = config.getAttribute( ATTR_FACET );
                final String cid = config.getAttribute( ATTR_CATEGORY );
                final String rct = config.getAttribute( ATTR_RUNTIME_COMPONENT_TYPE );
                
                final Set<Object> targets = new HashSet<Object>();
                
                if( fid != null )
                {
                    if( ! ProjectFacetsManager.isProjectFacetDefined( fid ) )
                    {
                        final String msg
                            = NLS.bind( Resources.facetNotDefined, 
                                        config.getContributor().getName(), fid );
                        
                        FacetUiPlugin.log( msg );
                        
                        break;
                    }
                    
                    targets.add( ProjectFacetsManager.getProjectFacet( fid ) );
                }
                else if( cid != null )
                {
                    if( ! ProjectFacetsManager.isCategoryDefined( cid ) )
                    {
                        final String msg
                            = NLS.bind( Resources.categoryNotDefined, 
                                        config.getContributor().getName(), fid );
                        
                        FacetUiPlugin.log( msg );
                        
                        break;
                    }
                    
                    targets.add( ProjectFacetsManager.getCategory( cid ) );
                }
                else if( rct != null )
                {
                    if( ! RuntimeManager.isRuntimeComponentTypeDefined( rct ) )
                    {
                        final String msg
                            = NLS.bind( Resources.runtimeComponentTypeNotDefined, 
                                        config.getContributor().getName(), rct );
                        
                        FacetUiPlugin.log( msg );
                        
                        break;
                    }
                    
                    final IRuntimeComponentType type = RuntimeManager.getRuntimeComponentType( rct );
                    final String vexpr = config.getAttribute( ATTR_VERSION );
                    
                    if( vexpr == null )
                    {
                        targets.addAll( type.getVersions() );
                    }
                    else
                    {
                        try
                        {
                            targets.addAll( type.getVersions( vexpr ) );
                        }
                        catch( Exception e )
                        {
                            FacetUiPlugin.log( e );
                        }
                    }
                }
                else
                {
                    reportMissingAttribute( config, ATTR_FACET );
                    break;
                }
                
                final String path = config.getAttribute( ATTR_PATH );
                
                if( path == null )
                {
                    reportMissingAttribute( config, ATTR_PATH );
                }
                        
                final String plugin = config.getContributor().getName();
                final Bundle bundle = Platform.getBundle( plugin );
                final URL url = FileLocator.find( bundle, new Path( path ), null );
                
                if( url == null )
                {
                    final String msg
                        = NLS.bind( Resources.iconNotFound, plugin, path );
                    
                    FacetUiPlugin.log( msg );
                }
                else
                {
                    final ImageDescriptor imgdesc
                        = ImageDescriptor.createFromURL( url );
                    
                    for( Object target : targets )
                    {
                        icons.put( target, imgdesc );
                    }
                }
            }
        }
    }
    
    private static void reportMissingAttribute( final IConfigurationElement el,
                                                final String attribute )
    {
        final String[] params 
            = new String[] { el.getContributor().getName(), el.getName(), 
                             attribute };
        
        final String msg = NLS.bind( Resources.missingAttribute, params ); 
    
        FacetUiPlugin.log( msg );
    }
    
    private static class WizardPagesInfo
    {
        public String plugin;
        public List<String> pages;
    }

    private static final class Resources
    
        extends NLS
        
    {
        public static String missingAttribute;
        public static String facetNotDefined;
        public static String facetVersionNotDefined;
        public static String categoryNotDefined;
        public static String runtimeComponentTypeNotDefined;
        public static String failedToCreate;
        public static String invalidActionType;
        public static String iconNotFound;
        public static String wizardExtensionPointDeprecated;
        public static String actionNotDefined;
        
        static
        {
            initializeMessages( ProjectFacetsUiManagerImpl.class.getName(), 
                                Resources.class );
        }
    }
    
}
