/*******************************************************************************
 * Copyright (c) 2007, 2008 IBM Corporation and Others
 * 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:
 *    Daisuke SATO - initial API and implementation
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.ai.tts.protalker.engine;

import java.util.Enumeration;
import java.util.Vector;

import org.eclipse.actf.ai.tts.ITTSEngine;
import org.eclipse.actf.ai.voice.IVoiceEventListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleControlSite;
import org.eclipse.swt.ole.win32.OleEvent;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.OleListener;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * ProTalker COM wrapper
 */
public class ProTalkerBridge implements OleListener {
	public static final int VOICE_MALE = 0;

	public static final int VOICE_FEMALE = 1;

	private static final String SpeakWebText = "SpeakWebText";

	private static final String AboutDlg = "AboutDlg";

	private static final String GeneralDlg = "GeneralDlg";

	private static final String Pause = "Pause";

	private static final String Start = "Start";

	private static final String Resume = "Resume";

	private static final String Reset = "Reset";

	private static final String Speak = "Speak";

	private static final String SendText = "SendText";

	private static final String AboutBox = "AboutBox";

	private static final String Gender = "Gender";

	private static final String Age = "Age";

	private static final String ModeGuid = "ModeGuid";

	private static final String Speed = "Speed";

	private static final String Pitch = "Pitch";

	private static final String Volume = "Volume";

	private static final String UseButton = "UseButton";

	private OleControlSite site = null;

	private OleAutomation auto = null;

	private OleFrame frame = null;

	private Vector<IVoiceEventListener> indexListener = new Vector<IVoiceEventListener>();
	
	private Shell parent;

	ProTalkerBridge(Display display) {
		parent = new Shell();
		parent.setLayout(new FillLayout());
		frame = new OleFrame(parent, SWT.NONE);
		try {
			site = new OleControlSite(frame, SWT.NONE, "PTSVR.PtSvrCtrl.1");
		} catch (SWTException e) {
			site = null;
			return;
		}
		auto = new OleAutomation(site);
		site.doVerb(OLE.OLEIVERB_SHOW);
		for (int i = 0; i < 10; i++) {
			site.addEventListener(i, this);
		}
		setVoice(VOICE_MALE);
	}
	
	public void dispose(){
		auto.dispose();
		parent.dispose();
	}

	private Variant getProperty(String name) {
		int id = auto.getIDsOfNames(new String[] { name })[0];
		return auto.getProperty(id);
	}

	private void setProperty(String name, Variant value) {
		int id = auto.getIDsOfNames(new String[] { name })[0];
		auto.setProperty(id, value);
	}

	private int getInt(String name) {
		return getProperty(name).getInt();
	}

	private void setInt(String name, int value) {
		setProperty(name, new Variant(value));
	}

	private String getString(String name) {
		return getProperty(name).getString();
	}

	private void setString(String name, String value) {
		setProperty(name, new Variant(value));
	}

	private boolean getBoolean(String name) {
		return getProperty(name).getBoolean();
	}

	private void setBoolean(String name, boolean value) {
		setProperty(name, new Variant(value));
	}

	private void invoke(String name) {
		invoke(name, new Variant[0]);
	}

	private void invoke(String name, final Variant[] arg) {
		final int id = auto.getIDsOfNames(new String[] { name })[0];
		auto.invoke(id, arg);
	}

	// properties
	/**
	 * @return the gender type of this engine.
	 */
	public int getGender() {
		return getInt(Gender);
	}

	/**
	 * @return the age property of this engine.
	 */
	public int getAge() {
		return getInt(Age);
	}

	/**
	 * @return the guid of the current mode.
	 */
	public String getModeGuid() {
		return getString(ModeGuid);
	}

	/**
	 * @param guid
	 *            the guid to be set.
	 */
	public void setModeGuid(String guid) {
		setString(ModeGuid, guid);
	}

	/**
	 * @return the speed property of this engine.
	 */
	public int getSpeed() {
		return getInt(Speed);
	}

	/**
	 * Set the speed of this engine in the scale of this engine.
	 * 
	 * @param value
	 *            the speed property to be set.
	 */
	public void setSpeed(int value) {
		setInt(Speed, value);
	}

	/**
	 * @return the pitch property of this engine.
	 */
	public int getPitch() {
		return getInt(Pitch);
	}

	/**
	 * @param value
	 *            the pitch property to be set.
	 */
	public void setPitch(int value) {
		setInt(Pitch, value);
	}

	/**
	 * @return the volume property of this engine.
	 */
	public int getVolume() {
		return getInt(Volume);
	}

	/**
	 * @param value
	 *            the volume property to be set.
	 */
	public void setVolume(int value) {
		setInt(Volume, value);
	}

	/**
	 * @return whether the GUI button is used or not.
	 */
	public boolean getUseButton() {
		return getBoolean(UseButton);
	}

	/**
	 * @param value
	 *            the using button flag to be set.
	 */
	public void setUseButton(boolean value) {
		setBoolean(UseButton, value);
	}

	// methods
	/**
	 * Invoke SpeakWebText method of this engine.
	 */
	public void speakWebText() {
		invoke(SpeakWebText);
	}

	/**
	 * Shows the about dialog.
	 */
	public void aboutDlg() {
		invoke(AboutDlg);
	}

	/**
	 * Shows the dialog of property settings.
	 */
	public void generalDlg() {
		invoke(GeneralDlg);
	}

	/**
	 * Pause the speech.
	 */
	public void pause() {
		invoke(Pause);
	}

	/**
	 * Start to speak.
	 */
	public void start() {
		invoke(Start);
	}

	/**
	 * Resume to speak.
	 */
	public void resume() {
		invoke(Resume);
	}

	/**
	 * Reset the state of this voice engine.
	 */
	public void reset() {
		// It doesn't work well by invoking Reset method once.
		invoke(Reset);
		invoke(Speak, new Variant[] { new Variant(" ") });
		invoke(Reset);
		invoke(Speak, new Variant[] { new Variant(" ") });
	}

	/**
	 * @param text
	 *            the text to be spoken.
	 */
	public void sendText(String text) {
		invoke(SendText, new Variant[] { new Variant(text) });
	}

	/**
	 * Shows the about box.
	 */
	public void aboutBox() {
		invoke(AboutBox);
	}

	/**
	 * @param text
	 *            the text to be spoken.
	 * @param flags
	 *            the flag of the voice engine behavior.
	 * @param index
	 *            the index mark to be set. The index will be returned with
	 *            voice event.
	 * @see ITTSEngine#TTSFLAG_DEFAULT
	 * @see ITTSEngine#TTSFLAG_FLUSH
	 */
	public void speak(String text, int flags, int index) {
		StringBuffer sb = new StringBuffer();
		sb.append("\\Mrk=");
		sb.append(index);
		sb.append("\\");
		sb.append(text);
		sb.append("\\Mrk=-1\\");

		if (flags == ITTSEngine.TTSFLAG_DEFAULT) {
			invoke(Speak, new Variant[] { new Variant(sb.toString()) });
		} else if (flags == ITTSEngine.TTSFLAG_FLUSH) {
			reset();
			invoke(Speak, new Variant[] { new Variant(sb.toString()) });
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.ole.win32.OleListener#handleEvent(org.eclipse.swt.ole.win32.OleEvent)
	 */
	public void handleEvent(OleEvent event) {
		if (event.type == 3) { // Bookmark
			for (Enumeration<IVoiceEventListener> e = indexListener.elements(); e
					.hasMoreElements();) {
				e.nextElement().indexReceived(event.arguments[0].getInt());
			}
		}
	}

	/**
	 * @param listener
	 */
	public void addIndexListener(IVoiceEventListener listener) {
		indexListener.add(listener);
	}

	/**
	 * @param listener
	 */
	public void removeIndexListener(IVoiceEventListener listener) {
		indexListener.remove(listener);
	}

	/**
	 * @param type
	 *            the voice type of this engine.
	 * @see #VOICE_MALE
	 * @see #VOICE_FEMALE
	 */
	public void setVoice(int type) {
		if (type == VOICE_MALE) {
			setModeGuid("{904AAB60-5D94-11D0-830A-444553540000}");
		} else if (type == VOICE_FEMALE) {
			setModeGuid("{904AAB61-5D94-11d0-830A-444553540000}");
		}
	}

	/**
	 * @return whether this object can be used or not.
	 */
	public boolean isAvailable() {
		return auto != null;
	}
}
