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

import com.google.common.base.Objects;
import com.google.inject.Inject;
import java.nio.charset.Charset;
import java.util.function.Consumer;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean;
import org.eclipse.osbp.xtext.datainterchange.ui.DataDSLDocumentationTranslator;
import org.eclipse.osbp.xtext.datainterchange.ui.contentassist.AbstractDataDSLProposalProvider;
import org.eclipse.osbp.xtext.datainterchange.ui.contentassist.FileNameTextApplier;
import org.eclipse.osbp.xtext.datainterchange.ui.contentassist.LocaleTextApplier;
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;

@SuppressWarnings("all")
public class DataDSLProposalProvider extends AbstractDataDSLProposalProvider {
  @Inject
  private TerminalsProposalProvider provider;
  
  @Inject
  private BasicDSLProposalProviderHelper providerHelper;
  
  @Override
  protected StyledString getKeywordDisplayString(final Keyword keyword) {
    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, 
      DataDSLDocumentationTranslator.instance());
  }
  
  /**
   * This override will enable 1 length non letter characters as keyword.
   */
  @Override
  protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
    return true;
  }
  
  @Override
  public void completeDataInterchangeFileXML_FileURL(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.filePickerProposal(model, assignment, context, acceptor, "*.xml");
  }
  
  @Override
  public void completeDataInterchangeFileCSV_FileURL(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.filePickerProposal(model, assignment, context, acceptor, "*.csv");
  }
  
  @Override
  public void completeDataInterchangeFileEDI_FileURL(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.filePickerProposal(model, assignment, context, acceptor, "*.edi");
  }
  
  @Override
  public void completeDataInterchangeFileEDI_MappingModel(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.mappingPickerProposal(model, assignment, context, acceptor, "*.xml");
  }
  
  @Override
  public void completeDataInterchangeFileXML_Encoding(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    final Consumer<String> _function = (String it) -> {
      acceptor.accept(this.createCompletionProposal((("\"" + it) + "\""), it, null, context));
    };
    Charset.availableCharsets().keySet().forEach(_function);
  }
  
  @Override
  public void completeDataInterchangeFileCSV_Encoding(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    final Consumer<String> _function = (String it) -> {
      acceptor.accept(this.createCompletionProposal((("\"" + it) + "\""), it, null, context));
    };
    Charset.availableCharsets().keySet().forEach(_function);
  }
  
  @Override
  public void completeDataInterchangeFileEDI_Encoding(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    final Consumer<String> _function = (String it) -> {
      acceptor.accept(this.createCompletionProposal((("\"" + it) + "\""), it, null, context));
    };
    Charset.availableCharsets().keySet().forEach(_function);
  }
  
  public void filePickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select input file...", context);
    ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
    boolean _notEquals = (!Objects.equal(fileName, null));
    if (_notEquals) {
      FileNameTextApplier applier = new FileNameTextApplier();
      applier.setExtensions(fileExtensions.split(","));
      applier.setContext(context);
      fileName.setTextApplier(applier);
    }
    acceptor.accept(fileName);
  }
  
  public void mappingPickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select mapping file...", context);
    ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
    boolean _notEquals = (!Objects.equal(fileName, null));
    if (_notEquals) {
      FileNameTextApplier applier = new FileNameTextApplier();
      applier.setExtensions(fileExtensions.split(","));
      applier.setContext(context);
      fileName.setTextApplier(applier);
    }
    acceptor.accept(fileName);
  }
  
  public void chooseLocaleProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select locale...", context);
    ConfigurableCompletionProposal locale = ((ConfigurableCompletionProposal) _createCompletionProposal);
    boolean _notEquals = (!Objects.equal(locale, null));
    if (_notEquals) {
      LocaleTextApplier applier = new LocaleTextApplier();
      applier.setContext(context);
      locale.setTextApplier(applier);
    }
    acceptor.accept(locale);
  }
  
  @Override
  protected boolean isValidProposal(final String proposal, final String prefix, final ContentAssistContext context) {
    boolean result = super.isValidProposal(proposal, prefix, context);
    EObject _currentModel = context.getCurrentModel();
    if ((_currentModel instanceof DataInterchangeBean)) {
      EObject _currentModel_1 = context.getCurrentModel();
      return this.isBeanValidProposal(((DataInterchangeBean) _currentModel_1), proposal, result);
    }
    return result;
  }
  
  public boolean isBeanValidProposal(final DataInterchangeBean bean, final String proposal, final boolean result) {
    return result;
  }
  
  @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);
  }
  
  @Override
  public void complete_INT(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_INT(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void complete_TRANSLATABLEID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_ID(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void complete_TRANSLATABLESTRING(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_STRING(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void complete_STRING(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_STRING(model, ruleCall, context, acceptor);
  }
}
