/**
 *                                                                            
 *  Copyright (c) 2011, 2018 - 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
 * 
 * generated by Xtext 2.11.0
 *
 */

package org.eclipse.osbp.xtext.signal.ui.contentassist

import com.google.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper
import org.eclipse.osbp.xtext.signal.SignalHandler
import org.eclipse.osbp.xtext.signal.SignalHandlerTypeEnum
import org.eclipse.osbp.xtext.signal.SignalTypeEnum
import org.eclipse.osbp.xtext.signal.SignalWatcher
import org.eclipse.swt.widgets.DirectoryDialog
import org.eclipse.wb.internal.core.nls.ui.ChooseLocaleDialog
import org.eclipse.xtext.Assignment
import org.eclipse.xtext.EcoreUtil2
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.ui.editor.contentassist.ReplacementTextApplier

/**
 * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#content-assist
 * on how to customize the content assistant.
 */
class SignalDSLProposalProvider extends AbstractSignalDSLProposalProvider {
	
	@Inject TerminalsProposalProvider provider
	@Inject BasicDSLProposalProviderHelper providerHelper
	
	override complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
	}
	
	
	override completeSignalWatcher_Directory(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		directoryPickerProposal(model, context, acceptor)
	}

	def directoryPickerProposal(EObject model, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		var dirName = createCompletionProposal("Select directory...", context) as ConfigurableCompletionProposal
		if (dirName !== null) {
			var applier = new DirectoryNameTextApplier()
			applier.setContext(context)
			dirName.setTextApplier = applier
		} 
		acceptor.accept(dirName)
	}
	
	/**
	 * This method decided which proposals will be valid. 
	 */
	override protected boolean isValidProposal(String proposal, String prefix, ContentAssistContext context) {
		var result = super.isValidProposal(proposal, prefix, context)
		if (context.currentModel instanceof SignalHandler){
			result = isValidProposalSignalHandlerType(proposal, prefix, (context.currentModel as SignalHandler), result)
		}
		return result
	}
	
	def private boolean isValidProposalSignalHandlerType(String proposal, String prefix, SignalHandler handler, boolean result) {
		
		if(handler !== null){			
			val watcher = EcoreUtil2.resolve(handler.eContainer, handler.eResource)
			if(watcher !== null && watcher instanceof SignalWatcher){
				switch((watcher as SignalWatcher).signal) {
					case SignalTypeEnum.ALL:
						return true
					case SignalTypeEnum.CREATESIGNALS:
						return SignalHandlerTypeEnum.DOAFTERCREATE.literal.equals(proposal)
					case SignalTypeEnum.DELETESIGNALS:
						return SignalHandlerTypeEnum.DOAFTERDELETE.literal.equals(proposal)
					case SignalTypeEnum.MODIFYSIGNALS:
						return SignalHandlerTypeEnum.DOAFTERMODIFY.literal.equals(proposal)
					default:
						return false
				}
			}
		}
		return result
	}
	
	// ------------------------ delegates to TerminalsProposalProvider -----------------
	override public void complete_INT(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		provider.complete_INT(model, ruleCall, context, acceptor)
	}

	override public void complete_STRING(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		provider.complete_STRING(model, ruleCall, context, acceptor)
	}
	
}

class LocaleTextApplier extends ReplacementTextApplier {
	var ContentAssistContext context

	def setContext(ContentAssistContext context) {
		this.context = context
	}

	override getActualReplacementString(ConfigurableCompletionProposal proposal) {
		var display = context.getViewer().getTextWidget().getDisplay();
		var localeDialog = new ChooseLocaleDialog(display.getActiveShell());
		localeDialog.open();
		return "\"".concat(localeDialog.selectedLocale.toString).concat("\"");
	}
}

class DirectoryNameTextApplier extends ReplacementTextApplier {
	var ContentAssistContext context

	def setContext(ContentAssistContext context) {
		this.context = context
	}

	// this will inject a directory dialog when selecting the dialog picker proposal 
	override getActualReplacementString(ConfigurableCompletionProposal proposal) {
		var display = context.getViewer().getTextWidget().getDisplay();
		var dirDialog = new DirectoryDialog(display.getActiveShell());
		var dirName = dirDialog.open();
		dirName = dirName.replace("\\", "/")
		return "\"".concat(dirName).concat("\"");
	}
}

