/*******************************************************************************
 * Copyright (c) 2006, 2007 Oracle Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    Cameron Bateman/Oracle - initial API and implementation
 *    
 ********************************************************************************/

package org.eclipse.jst.jsf.core.internal.contentassist.el;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
import org.eclipse.jst.jsf.context.symbol.ISymbol;
import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
import org.eclipse.jst.jsf.context.symbol.provider.ProposalCreationFactoryAdapter;
import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
import org.eclipse.swt.graphics.Image;

/**
 * A strategy for getting completions for EL id completions like:
 * 
 *     var
 *     ^
 *     
 * @author cbateman
 *
 */
class IdCompletionStrategy extends ContentAssistStrategy 
{

    /**
     * Construct a strategy for completing an ID completion
     * 
     * @param prefixValue
     * @param proposalStart - the part of the proposal which was already typed when user invoked autocomplete
     */
    public IdCompletionStrategy(final String prefixValue, String proposalStart) 
    {
        super(ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION, prefixValue, proposalStart);
    }

    /**
     * @see org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy#getProposals(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
     */
    public List<ICompletionProposal> getProposals(IStructuredDocumentContext context) 
    {
        final List<ICompletionProposal> completionList = new ArrayList<ICompletionProposal>();
        final IWorkspaceContextResolver workspaceResolver = 
            IStructuredDocumentContextResolverFactory.INSTANCE.
                getWorkspaceContextResolver(context);

        final IFile  iFile = (IFile) workspaceResolver.getResource();

        ISymbol[]       symbols = null;

        if (iFile != null)
        {
            final ISymbolContextResolver  symbolResolver =
                StructuredDocumentSymbolResolverFactory.getInstance().
                    getSymbolContextResolver(context);
            
            symbols = symbolResolver.getAllVariables();
        }

        final ComposedAdapterFactory factory =
            new ComposedAdapterFactory(ComposedAdapterFactory.
                                                  Descriptor.Registry.INSTANCE);

        final IProposalCreationFactory  creationInfo =
           new MyProposalFactory(context.getDocumentPosition(), getProposalStart().length());

        for (int i = 0; symbols != null && i < symbols.length; i++)
        {
            final ISymbol  symbol = symbols[i];

            final Object  adapter =  
                factory.adapt(symbol, IContentProposalProvider.class);
                
            if (adapter instanceof IContentProposalProvider)
            {
                final IContentProposalProvider  provider = 
                    (IContentProposalProvider) adapter;
                final ICompletionProposal[] proposal  = 
                    provider.getProposals(symbol, creationInfo);
                if (proposal != null)
                {
                	addProposalsMatchingProposalStart(completionList, proposal);
                }
            }
        }

        return Collections.unmodifiableList(completionList);
    }
    
    private static class MyProposalFactory extends ProposalCreationFactoryAdapter
    {
        private final static int   HIGH_RELEVANCE = 2;
        private final static int   NORMAL_RELEVANCE = 1;
        private final static int   LOW_RELEVANCE = 0;

        /**
         * @param replacementOffset
         * @param replacementLength
         */
        public MyProposalFactory(int replacementOffset, int replacementLength) 
        {
        	/*TODO I changed the meaning of "replacementLength" from "number of chars AFTER cursor to be
        	 * replaced" to "number of chars BEFORE cursor to be replaced. Since "replacementLength"
        	 * has always been 0 (constructor is only called by IdCompletionStrategy.getProposals()),
        	 * this should not change anything, but I don't know if there have been different plans
        	 * for "replacementLength".
        	 * TODO Maybe this change should be done in the super class instead?
        	 */
            super(replacementOffset - replacementLength, replacementLength);
        }

        public ICompletionProposal createProposal(final String replacementText, 
                                                  final String displayText, 
                                                  final String additionalText, 
                                                  final Image displayImage, 
                                                  final Object targetObject) 
        {
            return createDefaultProposal(replacementText, _replacementOffset, 
                                         _replacementLength, 
                                         replacementText.length(), displayImage, 
                                         displayText, null, additionalText, 
                                         getRelevance(targetObject));
        }
        
        private int getRelevance(Object target)
        {
            // put tag vars at top, followed by beans, then implicits and other
            if (target instanceof IInstanceSymbol)
            {
                final IInstanceSymbol symbol = (IInstanceSymbol) target;
                
                switch (symbol.getRuntimeSource().getValue())
                {
                    case ERuntimeSource.TAG_INSTANTIATED_SYMBOL:
                        return HIGH_RELEVANCE;
                    case ERuntimeSource.MANAGED_BEAN_SYMBOL:
                        return NORMAL_RELEVANCE;
                    case ERuntimeSource.BUILT_IN_SYMBOL:
                    case ERuntimeSource.OTHER:
                        return LOW_RELEVANCE;
                }
            }
            
            // if none of the above, return low relevance
            return LOW_RELEVANCE;
        }
    }
}
