/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.motorola.studio.android.emulator.core.utils;

import java.util.Collection;
import java.util.HashSet;

import org.eclipse.sequoyah.vnc.protocol.lib.ProtocolHandle;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import com.motorola.studio.android.emulator.core.devfrm.DeviceFrameworkManager;
import com.motorola.studio.android.emulator.core.exception.InstanceNotFoundException;
import com.motorola.studio.android.emulator.core.model.IAndroidEmulatorInstance;
import com.motorola.studio.android.emulator.core.model.IEmulatorView;

/**
 * DESCRIPTION:
 * Utilities for Android Emulator restricted use
 * 
 * RESPONSIBILITY:
 * Provide common utility methods that can be used by any 
 * Android Emulator plugin.
 *
 * COLABORATORS:
 * None
 *
 * USAGE:
 * This class should not be instantiated and its methods should be called statically.
 */
public class EmulatorCoreUtils
{
    /**
     * Retrieves all views that implement IEmulatorView interface
     * 
     * @return All views that implement IEmulatorView interface
     */
    public static Collection<IEmulatorView> getAllAndroidViews()
    {
        final Collection<IEmulatorView> allViews = new HashSet<IEmulatorView>();

        PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable()
        {
            public void run()
            {
                IWorkbenchWindow activeWindow =
                        PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                if (activeWindow != null)
                {
                    IWorkbenchPage[] activePages = activeWindow.getPages();
                    if (activePages != null)
                    {
                        for (IWorkbenchPage activePage : activePages)
                        {
                            if (activePage != null)
                            {
                                IViewReference[] allReferences = activePage.getViewReferences();
                                for (IViewReference ref : allReferences)
                                {
                                    IViewPart aView = ref.getView(false);
                                    if ((aView != null) && (aView instanceof IEmulatorView))
                                    {
                                        allViews.add((IEmulatorView) aView);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        });

        return allViews;
    }

    /**
     * Refresh all Emulator views
     */
    public static void refreshEmulatorViews()
    {
        Collection<IEmulatorView> allViews = EmulatorCoreUtils.getAllAndroidViews();
        for (IEmulatorView view : allViews)
        {
            view.refreshView();
        }
    }

    /**
     * Retrieves a Android Emulator instance mapped by the provided IP address
     * 
     * @param identifier The IP address associated with the desired instance
     * 
     * @return The Android Emulator instance that is working on the given address
     * 
     * @throws InstanceNotFoundException If the instance is not found at 
     *          device framework
     */
    public static IAndroidEmulatorInstance getAndroidInstanceByIdentifier(String identifier)
            throws InstanceNotFoundException
    {
        IAndroidEmulatorInstance desiredDevice = null;

        Collection<IAndroidEmulatorInstance> instanceList =
                DeviceFrameworkManager.getInstance().getAllInstances();
        for (IAndroidEmulatorInstance instance : instanceList)
        {
            String instanceIdentifier = instance.getInstanceIdentifier();
            if ((instanceIdentifier != null) && instanceIdentifier.equals(identifier))
            {
                desiredDevice = instance;
                break;
            }
        }

        if (desiredDevice == null)
        {
            throw new InstanceNotFoundException();
        }

        return desiredDevice;
    }

    /**
     * Retrieves a Android Emulator instance mapped by the provided 
     * protocol handle object
     * 
     * @param handle The protocol handle object associated with the 
     *                    desired instance
     * 
     * @return The Android Emulator instance that is working with
     *         the given protocol handle object
     * 
     * @throws InstanceNotFoundException If the instance is not found at 
     *          device framework
     */
    public static IAndroidEmulatorInstance getAndroidInstanceByHandle(ProtocolHandle handle)
            throws InstanceNotFoundException
    {
        IAndroidEmulatorInstance desiredDevice = null;
        Collection<IAndroidEmulatorInstance> instanceList =
                DeviceFrameworkManager.getInstance().getAllInstances();
        for (IAndroidEmulatorInstance instance : instanceList)
        {
            ProtocolHandle instanceHandle = instance.getProtocolHandle();
            if ((instanceHandle != null) && instanceHandle.equals(handle))
            {
                desiredDevice = instance;
                break;
            }
        }

        if (desiredDevice == null)
        {
            throw new InstanceNotFoundException();
        }

        return desiredDevice;
    }
}
