/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.common.model.ui.wizards.query;

import java.util.Properties;
import org.eclipse.swt.widgets.Shell;
import org.jboss.tools.common.meta.action.SpecialWizard;
import org.jboss.tools.common.meta.key.WizardKeys;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.ui.ModelUIPlugin;

public class AbstractQueryWizard implements SpecialWizard {
	
	public static class Property {
		public static final String HELP = "help"; //$NON-NLS-1$
		public static final String MODAL = "modal"; //$NON-NLS-1$
		public static final String TITLE = "title"; //$NON-NLS-1$
		public static final String SUBTITLE = "subtitle"; //$NON-NLS-1$
		public static final String MESSAGE = "message"; //$NON-NLS-1$
		public static final String BLOCKING = "blocking"; //$NON-NLS-1$
	}
	
	private AbstractQueryWizardView view = null;

	public void dispose() {
		if (view!=null) view.dispose();
		view = null;
	}

	public void setView(AbstractQueryWizardView view) {
		this.view = view;
	}
	
	public AbstractQueryWizardView getView() {
		return view;
	}

	public void setObject(Object object) {
		view.setModel(findModel(object));
		view.setObject(object);
		Properties p = findProperties(object);
		String key = (p == null) ? null : p.getProperty("help"); //$NON-NLS-1$
		if(key == null) {
			//put debuggin here
		} else {
			String title = p.getProperty(Property.TITLE);
			if(title == null) title = WizardKeys.getHeader(key);
			if(title == null) title = WizardKeys.getHeader("Properties"); // NON-NLS-1 //$NON-NLS-1$
			if(title == null) title = "Title is not found for key \"" + key + "\"";
			view.setWindowTitle(title);
			
			String subtitle = p.getProperty(Property.SUBTITLE);
			if(subtitle == null) subtitle = WizardKeys.getTitle(key);
			if(subtitle == null) subtitle = "Subtitle is not found for key \"" + key + "\"";
			view.setTitle(subtitle);
			
			String message = p.getProperty(Property.MESSAGE);
			if(message == null) message = WizardKeys.getString(key + ".Message"); //$NON-NLS-1$
			if(message != null) view.setMessage(message);
		}		
	}

	private Properties findProperties(Object o) {
		if (o instanceof Properties)
			return (Properties) o;
		if (!(o instanceof Object[]))
			return null;
		Object[] os = (Object[]) o;
		for (int i = 0; i < os.length; i++)
			if (os[i] instanceof Properties)
				return (Properties) os[i];
		return null;
	}

	private XModel findModel(Object o) {
		if(o instanceof Object[]) {
			Object[] os = (Object[])o;
			for (int i = 0; i < os.length; i++) {
				if(os[i] instanceof XModel) return (XModel)os[i];
				if(os[i] instanceof XModelObject) return ((XModelObject)os[i]).getModel();
			}
		}
		Properties p = findProperties(o);
		if(p != null) {
			Object q = p.get("model"); //$NON-NLS-1$
			if(q instanceof XModel) return (XModel)q;
			q = p.get("object"); //$NON-NLS-1$
			if(q instanceof XModelObject) return ((XModelObject)q).getModel();
		}
		return null;
	}

	public int execute() {
		Shell shell = ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
		IQueryDialog dialog = createDialog(shell);
		dialog.getDialog().open();
		return view.code();
	}
	
	public IQueryDialog createDialog(Shell shell) {
		IQueryDialog dialog = new AbstractQueryDialog(shell);
		setUpDialog(dialog);
		return dialog;
	}

	protected final void setUpDialog(IQueryDialog dialog) {
		dialog.setView(view);
		dialog.getDialog().create();
		view.setDialog(dialog.getDialog());
	}

}
