/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 *  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:
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 */
package org.eclipse.osbp.xtext.messagedsl.ui.contentassist;

import com.google.inject.Inject;
import java.util.TreeMap;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
import org.eclipse.osbp.xtext.messagedsl.MessageItem;
import org.eclipse.osbp.xtext.messagedsl.MessageParameter;
import org.eclipse.osbp.xtext.messagedsl.ParameterTypeEnum;
import org.eclipse.osbp.xtext.messagedsl.ui.MessageDslUiDocumentationTranslator;
import org.eclipse.osbp.xtext.messagedsl.ui.contentassist.AbstractMessageDslProposalProvider;
import org.eclipse.osbp.xtext.messagedsl.ui.contentassist.InsideStringConfigurableCompletionProposal;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder;
import org.eclipse.xtext.xbase.lib.Extension;

/**
 * see https://eclipse.org/Xtext/documentation/304_ide_concepts.html#content-assist on how to customize content assistant
 */
@SuppressWarnings("all")
public class MessageDslProposalProvider extends AbstractMessageDslProposalProvider {
  @Inject
  private TerminalsProposalProvider provider;
  
  @Inject
  private BasicDSLProposalProviderHelper providerHelper;
  
  /**
   * @see BasicDSLProposalProviderHelper#getKeywordDisplayString(Keyword, BasicDSLUiTranslator)
   * @param keyword the keyword to get the displayed string for
   * @return the displayed string
   */
  @Override
  protected StyledString getKeywordDisplayString(final Keyword keyword) {
    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, MessageDslUiDocumentationTranslator.instance());
  }
  
  /**
   * This override will enable 1 length non letter characters as keyword.
   */
  @Override
  protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
    return true;
  }
  
  /**
   * convenience API to build and initialize JVM types and their members.
   */
  @Inject
  @Extension
  private JvmTypesBuilder _jvmTypesBuilder;
  
  @Override
  public void complete_QualifiedName(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this);
  }
  
  /**
   * see also {@link org.eclipse.osbp.xtext.messagedsl.common.Message.prepareMessage()}
   */
  @Override
  public void completeMessageText_Text(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completeMessageText_Text(model, assignment, context, acceptor);
    final TreeMap<String, String> available = new TreeMap<String, String>();
    final TreeMap<String, String> used = new TreeMap<String, String>();
    final Image image = ((Image) null);
    final String document = context.getViewer().getDocument().get().replace("\\\"", "\'\'");
    final int formatoffset = context.getReplaceRegion().getOffset();
    final int nextquote = document.indexOf("\"", (formatoffset + 1));
    final String replaceRegion = document.substring(formatoffset, (nextquote + 1));
    final Consumer<MessageParameter> _function = new Consumer<MessageParameter>() {
      @Override
      public void accept(final MessageParameter parameter) {
        ParameterTypeEnum _oftype = parameter.getOftype();
        if (_oftype != null) {
          switch (_oftype) {
            case BOOLEAN:
              StringConcatenation _builder = new StringConcatenation();
              _builder.append("%%");
              String _name = parameter.getName();
              _builder.append(_name);
              _builder.append("%%");
              final String proposal = _builder.toString();
              StringConcatenation _builder_1 = new StringConcatenation();
              _builder_1.append(proposal);
              _builder_1.append(" (boolean) ");
              String _documentation = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
              _builder_1.append(_documentation);
              final String displayString = _builder_1.toString();
              boolean _contains = replaceRegion.contains(proposal);
              if (_contains) {
                StringConcatenation _builder_2 = new StringConcatenation();
                _builder_2.append("used: ");
                _builder_2.append(displayString);
                used.put(proposal, _builder_2.toString());
              } else {
                available.put(proposal, displayString);
              }
              break;
            case INTEGER:
              StringConcatenation _builder_3 = new StringConcatenation();
              _builder_3.append("%%");
              String _name_1 = parameter.getName();
              _builder_3.append(_name_1);
              _builder_3.append("%%");
              final String proposal_1 = _builder_3.toString();
              StringConcatenation _builder_4 = new StringConcatenation();
              _builder_4.append(proposal_1);
              _builder_4.append(" (int) ");
              String _documentation_1 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
              _builder_4.append(_documentation_1);
              final String displayString_1 = _builder_4.toString();
              boolean _contains_1 = replaceRegion.contains(proposal_1);
              if (_contains_1) {
                StringConcatenation _builder_5 = new StringConcatenation();
                _builder_5.append("used: ");
                _builder_5.append(displayString_1);
                used.put(proposal_1, _builder_5.toString());
              } else {
                available.put(proposal_1, displayString_1);
              }
              break;
            case DOUBLE:
              StringConcatenation _builder_6 = new StringConcatenation();
              _builder_6.append("%%");
              String _name_2 = parameter.getName();
              _builder_6.append(_name_2);
              _builder_6.append("%%");
              final String proposal_2 = _builder_6.toString();
              StringConcatenation _builder_7 = new StringConcatenation();
              _builder_7.append(proposal_2);
              _builder_7.append(" (double) ");
              String _documentation_2 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
              _builder_7.append(_documentation_2);
              final String displayString_2 = _builder_7.toString();
              boolean _contains_2 = replaceRegion.contains(proposal_2);
              if (_contains_2) {
                StringConcatenation _builder_8 = new StringConcatenation();
                _builder_8.append("used: ");
                _builder_8.append(displayString_2);
                used.put(proposal_2, _builder_8.toString());
              } else {
                available.put(proposal_2, displayString_2);
              }
              break;
            case STRING:
              StringConcatenation _builder_9 = new StringConcatenation();
              _builder_9.append("%%");
              String _name_3 = parameter.getName();
              _builder_9.append(_name_3);
              _builder_9.append("%%");
              final String proposal_3 = _builder_9.toString();
              StringConcatenation _builder_10 = new StringConcatenation();
              _builder_10.append(proposal_3);
              _builder_10.append(" (String) ");
              String _documentation_3 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
              _builder_10.append(_documentation_3);
              final String displayString_3 = _builder_10.toString();
              boolean _contains_3 = replaceRegion.contains(proposal_3);
              if (_contains_3) {
                StringConcatenation _builder_11 = new StringConcatenation();
                _builder_11.append("used: ");
                _builder_11.append(displayString_3);
                used.put(proposal_3, _builder_11.toString());
              } else {
                available.put(proposal_3, displayString_3);
              }
              break;
            case CLASS:
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".canonicalName%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (canonical name for Class) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".simpleName%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (simple name for Class) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              break;
            case OBJECT:
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".canonicalName%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (canonical name for Object) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".simpleName%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (simple name for Object) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              break;
            case EXCEPTION:
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".canonicalName%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (canonical name for Exception) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".simpleName%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (simple name for Exception) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".localizedMessage%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (localized message for Exception) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".localizedDetailMessage%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (localized detail message for Exception) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".localizedSimpleDetailMessage%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (localized simple detail message for Exception) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append("%%");
                String _name_4 = parameter.getName();
                _builder_12.append(_name_4);
                _builder_12.append(".stackTrace%%");
                final String proposal_4 = _builder_12.toString();
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(proposal_4);
                _builder_13.append(" (stack trace for Exception) ");
                String _documentation_4 = MessageDslProposalProvider.this._jvmTypesBuilder.getDocumentation(parameter);
                _builder_13.append(_documentation_4);
                final String displayString_4 = _builder_13.toString();
                boolean _contains_4 = replaceRegion.contains(proposal_4);
                if (_contains_4) {
                  StringConcatenation _builder_14 = new StringConcatenation();
                  _builder_14.append("used: ");
                  _builder_14.append(displayString_4);
                  used.put(proposal_4, _builder_14.toString());
                } else {
                  available.put(proposal_4, displayString_4);
                }
              }
              break;
            default:
              break;
          }
        }
      }
    };
    ((MessageItem) model).getParameters().forEach(_function);
    final BiConsumer<String, String> _function_1 = new BiConsumer<String, String>() {
      @Override
      public void accept(final String proposal, final String displayString) {
        StyledString _styledString = new StyledString(displayString);
        acceptor.accept(MessageDslProposalProvider.this.doCreateInStringProposal(proposal, _styledString, image, 
          MessageDslProposalProvider.this.getPriorityHelper().getDefaultPriority(), context));
      }
    };
    available.forEach(_function_1);
    final BiConsumer<String, String> _function_2 = new BiConsumer<String, String>() {
      @Override
      public void accept(final String proposal, final String displayString) {
        StyledString _styledString = new StyledString(displayString);
        acceptor.accept(MessageDslProposalProvider.this.doCreateInStringProposal(proposal, _styledString, image, 
          MessageDslProposalProvider.this.getPriorityHelper().getDefaultPriority(), context));
      }
    };
    used.forEach(_function_2);
  }
  
  private ConfigurableCompletionProposal doCreateInStringProposal(final String proposal, final StyledString displayString, final Image image, final int priority, final ContentAssistContext context) {
    final Point selectedRange = context.getViewer().getSelectedRange();
    final int replacementOffset = selectedRange.x;
    final int replacementLength = selectedRange.y;
    int _length = proposal.length();
    final InsideStringConfigurableCompletionProposal result = new InsideStringConfigurableCompletionProposal(proposal, replacementOffset, replacementLength, _length, image, displayString, null, null);
    result.setPriority(priority);
    result.setMatcher(context.getMatcher());
    result.setReplaceContextLength(context.getReplaceContextLength());
    return result;
  }
  
  @Override
  public void complete_ID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_ID(model, ruleCall, context, acceptor);
  }
}
