/*******************************************************************************
 * Copyright (c) 2007 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:
 *    Hisashi MIYASHITA - initial API and implementation
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.model.dom.dombycom.impl.flash;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.actf.model.dom.dombycom.AnalyzedResult;
import org.eclipse.actf.model.dom.dombycom.IFlashMSAANode;
import org.eclipse.actf.model.dom.dombycom.IFlashNode;
import org.eclipse.actf.model.dom.dombycom.INodeEx;
import org.eclipse.actf.model.dom.dombycom.INodeExSound;
import org.eclipse.actf.model.dom.dombycom.INodeExVideo;
import org.eclipse.actf.model.dom.dombycom.impl.Helper;
import org.eclipse.actf.model.dom.dombycom.impl.ListNodeListImpl;
import org.eclipse.actf.model.dom.dombycom.impl.NodeImpl;
import org.eclipse.actf.model.dom.dombycom.impl.html.ElementImpl;
import org.eclipse.actf.model.flash.FlashPlayerFactory;
import org.eclipse.actf.model.flash.IASNode;
import org.eclipse.actf.model.flash.IFlashConst;
import org.eclipse.actf.model.flash.IFlashPlayer;
import org.eclipse.actf.util.vocab.AbstractTerms;
import org.eclipse.actf.util.win32.comclutch.IDispatch;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

class FlashTopNodeImpl extends ElementImpl implements IFlashNode, IFlashConst {

	private static final String CLSID = "CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000";
	private static final String APP_TYPE = "application/x-shockwave-flash";

	private static final IFlashNode[] emptyResult = new IFlashNode[0];

	private FlashMSAANodeImpl cachedMSAA;

	private IFlashPlayer flashPlayer;

	static FlashTopNodeImpl newFlashNode(NodeImpl baseNode, IDispatch inode) {
		String clsid = (String) Helper.get(inode, "classid");
		if (CLSID.equalsIgnoreCase(clsid)) {
			return new FlashTopNodeImpl(baseNode, inode);
		}
		String type = (String) Helper.get((IDispatch) inode.invoke1(
				"getAttributeNode", "type"), "value");
		if (APP_TYPE.equalsIgnoreCase(type)) {
			return new FlashTopNodeImpl(baseNode, inode);
		}
		return null;
	}

	private FlashTopNodeImpl(NodeImpl baseNode, IDispatch idisp) {
		super(baseNode, idisp);

		flashPlayer = FlashPlayerFactory.getPlayerFromIDsipatch(idisp);

	}

	private INodeExVideo[] searchVideo() {
		IASNode[] videos = flashPlayer.searchVideo();
		int len = videos.length;
		INodeExVideo[] result = new INodeExVideo[len];
		for (int i = 0; i < len; i++) {
			// System.err.println("SVO:" + videos[i]);
			result[i] = new FlashVideoImpl(this, videos[i]);
		}
		return result;
	}

	private INodeExSound[] searchSound() {
		IASNode[] sounds = flashPlayer.searchSound();
		int len = sounds.length;
		INodeExSound[] result = new INodeExSound[len];
		for (int i = 0; i < len; i++) {
			result[i] = new FlashSoundImpl(sounds[i]);
		}
		return result;
	}

	public String getTarget() {
		return "";
	}

	public IFlashNode getNodeFromPath(String path) {
		IASNode node = flashPlayer.getNodeFromPath(path);
		if (node == null)
			return null;
		return new FlashNodeImpl(this, node);
	}

	public IFlashNode getNodeAtDepth(int depth) {
		return null;
	}

	public IFlashNode[] getInnerNodes() {
		return emptyResult;
	}

	private IFlashNode[] createIFlashNodeArray(IASNode[] nodes) {
		IFlashNode[] results = new IFlashNode[nodes.length];
		for (int i = 0; i < nodes.length; i++) {
			results[i] = new FlashNodeImpl(this, nodes[i]);
		}
		return results;
	}

	public IFlashNode[] translate() {
		return createIFlashNodeArray(flashPlayer
				.translateWithPath(PATH_ROOTLEVEL));
	}

	public int getDepth() {
		return INVALID_DEPTH;
	}

	public int getCurrentFrame() {
		return -1;
	}

	public INodeEx getBaseNode() {
		return this;
	}

	// --------------------------------------------------------------------------------
	// Node Overriding Impl.
	// --------------------------------------------------------------------------------

	@Override
	public Node getFirstChild() {
		//System.err.println("invalid(getFirstChild).");
		return null;
	}

	@Override
	public Node getLastChild() {
		//System.err.println("invalid(getLastChild).");
		return null;
	}

	@Override
	public NodeList getChildNodes() {
		List<Node> l = new ArrayList<Node>(3);
		for (int i = 0; i < 3; i++) {
			String levelxName = "_level" + i;
			IFlashNode levelx = getNodeFromPath(levelxName);
			if (levelx != null) {
				// System.err.println(levelxName + " is found.");
				l.add(levelx);
			}
		}

		return new ListNodeListImpl(l);
	}

	private boolean hasMedia = false;

	boolean hasMedia() {
		return hasMedia;
	}

	@Override
	public AnalyzedResult analyze(AnalyzedResult ar) {
		INodeExVideo[] videos = searchVideo();
		if (videos.length > 0) {
			hasMedia = true;
			for (int i = 0; i < videos.length; i++) {
				ar.addVideo(videos[i]);
			}
		}
		INodeExSound[] sounds = searchSound();
		for (int i = 0; i < sounds.length; i++) {
			ar.addSound(sounds[i]);
		}
		ar.addFlashTopNode(this);
		return ar;
	}

	public void repairFlash() {
		flashPlayer.repairFlash();
	}

	public IFlashMSAANode getMSAA() {
		if (cachedMSAA == null)
			cachedMSAA = FlashMSAANodeImpl.newMSAANode(this, inode);
		if ((cachedMSAA == null) || (cachedMSAA.getWindow() == 0))
			return null;
		// repairFlash();
		updateTarget();
		return cachedMSAA;
	}

	public long getHWND() {
		return FlashMSAANodeImpl.getHWNDFromObject(super.getINode());
	}

	@Override
	public AbstractTerms getTerms() {
		return FlashTerms.getInstance();
	}

	// TODO...
	private boolean updatedTarget = false;

	public void updateTarget() {
		if (updatedTarget)
			return;
		updatedTarget = flashPlayer.updateTarget();
	}
}
