/**
 *                                                                            
 *  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.blip.ui.contentassist

import com.google.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.jface.viewers.StyledString
import org.eclipse.osbp.fork.mihalis.opal.widgets.ImageSelectorDialog
import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper
import org.eclipse.osbp.xtext.blip.BlipItem
import org.eclipse.osbp.xtext.blip.common.BlipHelper
import org.eclipse.swt.graphics.Image
import org.eclipse.swt.layout.FillLayout
import org.eclipse.swt.widgets.Shell
import org.eclipse.xtext.Assignment
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

class ImageFileNameTextApplier extends ReplacementTextApplier {
	var ContentAssistContext context
	var String[] extensions

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

	def setExtensions(String[] fileExtensions) {
		extensions = fileExtensions
	}

	// this will inject a file dialog when selecting the file picker proposal 
	override getActualReplacementString(ConfigurableCompletionProposal proposal) {
		var display = context.getViewer().getTextWidget().getDisplay();
		var shell = new Shell(display);
		shell.setLayout(new FillLayout());
		var imageSelectorDialog = new ImageSelectorDialog(shell, 16);
		imageSelectorDialog.setFilterExtensions(extensions)
		var imageFileName = imageSelectorDialog.open();
//		fileName = fileName.replace("\\", "/")
		return "\"".concat(imageFileName).concat("\"");
	}
}

//class Bpmn2FileNameTextApplier extends ReplacementTextApplier {
//	var ContentAssistContext context
//	var String[] extensions
//
//	def setContext(ContentAssistContext context) {
//		this.context = context
//	}
//
//	def setExtensions(String[] fileExtensions) {
//		extensions = fileExtensions
//	}
//
//	// this will inject a file dialog when selecting the file picker proposal 
//	override getActualReplacementString(ConfigurableCompletionProposal proposal) {
//		var display = context.getViewer().getTextWidget().getDisplay();
//		var shell = new Shell(display);
//		var dialog = new FileDialog(shell, SWT.OPEN);
//		var bundleDirectory = ""
//   		dialog.filterExtensions = extensions;
//   		try {
//   			val tokens = context.resource.URI.toString.split("/")
//   			var base = null as String
//   			for	(var i = 0; i < 3; i++) {
//   				if	(base == null) {
//   					base = "";
//   				}
//   				else {
//   					base += "/"
//   				}
//   				base += tokens.get(i)
//   			}
//	   		val url = new URL(base)
//   			bundleDirectory = FileLocator.toFileURL(url).toString.replace("file:", "")
//   			var searchDirectory = bundleDirectory
//   			if	((new File(searchDirectory+"/models")).isDirectory) {
//   				searchDirectory = searchDirectory+"/models"
//   			}
//   			if	((new File(searchDirectory+"/bpmn")).isDirectory) {
//   				searchDirectory = searchDirectory+"/bpmn"
//   			}
//   			if	((new File(searchDirectory+"/bpmn2")).isDirectory) {
//   				searchDirectory = searchDirectory+"/bpmn2"
//   			}
//   			dialog.filterPath = searchDirectory
//   		}
//   		catch (Exception e) {}
//   		var result = dialog.open();
//   		if	(result != null) {
//   			result = '''"«result.replace("\\", "/").replace(bundleDirectory+"/", "")»"'''
//   		}
//   		return result
//	}
//}


/**
 * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
 */
class BlipDSLProposalProvider extends AbstractBlipDSLProposalProvider {
	
	@Inject TerminalsProposalProvider provider
	@Inject BasicDSLProposalProviderHelper providerHelper
	
//	override completeCCBlip_ResourceName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
//		bpmnFilePickerProposal(model, assignment, context, acceptor, "*.bpmn2")
//	}

	override completeBlipDtoPath_DtoPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		//super.completeBlipDtoPath_DtoPath(model, assignment, context, acceptor)
        val document = context.viewer.document.get.replace("\\\"", "''")
        // --- find the whole attribute-value ---
        var nextquote = context.replaceRegion.offset
        var character = document.charAt(nextquote)
        while ((nextquote < document.length) && !Character.isWhitespace(character)) {
        	nextquote += 1
        	character = document.charAt(nextquote)
        }
        // --- select the whole attribute-value ---
        context.viewer.setSelectedRange(context.replaceRegion.offset, nextquote - context.replaceRegion.offset)
        for	(proposal : BlipHelper.getAvailableDtoPaths(model as BlipItem)) {
			acceptor.accept(doCreateInStringProposal(proposal, new StyledString(proposal), null,
	    		getPriorityHelper().getDefaultPriority(), context));
        }
    }
    
    def private ConfigurableCompletionProposal doCreateInStringProposal(String proposal, StyledString displayString, Image image,
            int priority, ContentAssistContext context) {
        val selectedRange = context.viewer.getSelectedRange()
        val replacementOffset = selectedRange.x; // context.getReplaceRegion().getOffset();
        val replacementLength = selectedRange.y; // context.getReplaceRegion().getLength();
        val result = doCreateProposal(proposal, displayString, image, replacementOffset, replacementLength);
        result.setPriority(priority);
        result.setMatcher(context.getMatcher());
        result.setReplaceContextLength(context.getReplaceContextLength());
        return result;
    }

//	def bpmnFilePickerProposal(EObject model, Assignment assignment, ContentAssistContext context,
//		ICompletionProposalAcceptor acceptor, String fileExtensions) {
//		var fileName = createCompletionProposal("Select BPMN2 file...", context) as ConfigurableCompletionProposal
//		if (fileName != null) {
//			var applier = new Bpmn2FileNameTextApplier()
//			applier.setExtensions(fileExtensions.split(","))
//			applier.setContext(context)
//			fileName.setTextApplier = applier
//		}
//		acceptor.accept(fileName)
//	}
	
	override completeBlip_Image(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		imageFilePickerProposal(model, assignment, context, acceptor, ".jpg,.jpeg,.png")
	}
	
	def imageFilePickerProposal(EObject model, Assignment assignment, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor, String fileExtensions) {
		var fileName = createCompletionProposal("Select image file...", context) as ConfigurableCompletionProposal
		if (fileName != null) {
			var applier = new ImageFileNameTextApplier()
			applier.setExtensions(fileExtensions.split(","))
			applier.setContext(context)
			fileName.setTextApplier = applier
		}
		acceptor.accept(fileName)
	}
	
	override public void complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
	}
	
	override public void complete_QualifiedNameWithWildcard(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
	}
	
	// ------------------------ delegates to TerminalsProposalProvider -----------------
	override public void complete_TRANSLATABLESTRING(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		provider.complete_STRING(model, ruleCall, context, acceptor)
	}

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