/******************************************************************************
 * Copyright (c) 2005 BEA Systems, Inc.
 * 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 API and implementation
 ******************************************************************************/

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

import java.text.MessageFormat;
import java.util.Arrays;

import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;

/**
 * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
 */

public final class ValidationProblem 

    extends Status
    
{
    public static final class Type
    {
        public static final Type REQUIRES 
            = new Type( Resources.requires );
        
        public static final Type REQUIRES_ONE_OF_TWO
            = new Type( Resources.requiresOneOfTwo );

        public static final Type CONFLICTS 
            = new Type( Resources.oneof );
        
        public static final Type COMPLEX 
            = new Type( Resources.complex );
        
        public static final Type INSTALL_NOT_SUPPORTED 
            = new Type( Resources.installNotSupported );
        
        public static final Type UNINSTALL_NOT_SUPPORTED 
            = new Type( Resources.uninstallNotSupported );
        
        public static final Type VERSION_CHANGE_NOT_SUPPORTED 
            = new Type( Resources.versionChangeNotSupported );

        public static final Type MULTIPLE_ACTIONS_NOT_SUPPORTED 
            = new Type( Resources.multipleActionsNotSupported );

        public static final Type FACET_ALREADY_INSTALLED 
            = new Type( Resources.facetAlreadyInstalled );

        public static final Type CANNOT_UNINSTALL 
            = new Type( Resources.cannotUninstall );

        public static final Type CANNOT_CHANGE_VERSION
            = new Type( Resources.cannotChangeVersion );
        
        public final String msg;
        
        private Type( final String msg ) 
        {
            this.msg = msg;
        }

        private String getMessageTemplate()
        {
            return this.msg;
        }
    }
    
    private final Type type;
    private final Object[] params;
    
    public ValidationProblem( final Type type,
                              final Object[] params )
    {
        super( ERROR, FacetCorePlugin.PLUGIN_ID, 0, format( type, params ), 
               null );
        
        this.type = type;
        this.params = params;
    }
    
    public ValidationProblem( final Type type )
    {
        this( type, new Object[ 0 ] );
    }

    public ValidationProblem( final Type type,
                              final Object param )
    {
        this( type, new Object[] { param } );
    }
    
    public ValidationProblem( final Type type,
                              final Object param1,
                              final Object param2 )
    {
        this( type, new Object[] { param1, param2 } );
    }

    public ValidationProblem( final Type type,
                              final Object param1,
                              final Object param2,
                              final Object param3 )
    {
        this( type, new Object[] { param1, param2, param3 } );
    }
    
    public Type getType()
    {
        return this.type;
    }
    
    public Object[] getParameters()
    {
        return this.params;
    }

    public boolean equals( final Object obj )
    {
        if( ! ( obj instanceof ValidationProblem ) )
        {
            return false;
        }
        else
        {
            final ValidationProblem prob = (ValidationProblem) obj;
            
            return this.type.equals( prob.type ) &&
                   Arrays.equals( this.params, prob.params );
        }
    }
    
    public int hashCode()
    {
    	int hash = 0;
        
    	for( int i = 0; i < this.params.length; i++ ) 
        {
			hash = hash ^ this.params[ i ].hashCode();
		}
        
        return this.type.hashCode() ^ hash;
    }
    
    public String toString()
    {
        return getMessage();
    }
    
    private static String format( final Type type,
                                  final Object[] params )
    {
        return MessageFormat.format( type.getMessageTemplate(), params );
    }
    
    private static final class Resources
    
        extends NLS
        
    {
        public static String requires;
        public static String requiresOneOfTwo;
        public static String oneof;
        public static String complex;
        public static String installNotSupported;
        public static String uninstallNotSupported;
        public static String versionChangeNotSupported;
        public static String multipleActionsNotSupported;
        public static String facetAlreadyInstalled;
        public static String cannotUninstall;
        public static String cannotChangeVersion;
        
        static
        {
            initializeMessages( ValidationProblem.class.getName(), 
                                Resources.class );
        }
    }

}
