/*
 * 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.devices;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.TreeSet;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.sequoyah.device.common.utilities.exception.SequoyahException;
import org.eclipse.sequoyah.device.framework.DeviceUtils;
import org.eclipse.sequoyah.device.framework.factory.DeviceTypeRegistry;
import org.eclipse.sequoyah.device.framework.factory.InstanceRegistry;
import org.eclipse.sequoyah.device.framework.manager.InstanceManager;
import org.eclipse.sequoyah.device.framework.model.IDeviceType;
import org.eclipse.sequoyah.device.framework.model.IInstance;
import org.eclipse.sequoyah.device.framework.model.IInstanceBuilder;
import org.eclipse.sequoyah.device.framework.model.IService;
import org.eclipse.sequoyah.device.framework.model.handler.IServiceHandler;

import com.motorola.studio.android.adt.DDMSFacade;
import com.motorola.studio.android.adt.ISerialNumbered;

/**
 * This manager provides information about device instances
 * It shall work with TmL to be able to provide these information
 */
public class DevicesManager
{

    // instance
    private static DevicesManager instance;

    /**
     * Singleton
     * 
     * @return a unique DevicesManager instance
     */
    public static DevicesManager getInstance()
    {
        if (instance == null)
        {
            instance = new DevicesManager();
        }
        return instance;
    }

    /**
     * Get all devices registered in TmL
     * 
     * @return all devices registered in TmL
     */
    public Collection<ISerialNumbered> getAllDevices()
    {
        Collection<ISerialNumbered> devicesCollection = new LinkedHashSet<ISerialNumbered>();

        List<IInstance> tmlDevices = InstanceRegistry.getInstance().getInstances();

        for (IInstance tmlInstance : tmlDevices)
        {
            if (tmlInstance instanceof ISerialNumbered)
            {
                devicesCollection.add((ISerialNumbered) tmlInstance);
            }
        }
        return devicesCollection;
    }

    /**
     * Get all devices registered in TmL, sorted using the comparator passed as a parameter
     * 
     * @param comparator the comparator that will be used to sort the devices list
     * @return all devices registered in TmL, sorted using the comparator passed as a parameter
     */
    public Collection<ISerialNumbered> getAllDevices(Comparator<ISerialNumbered> comparator)
    {
        Collection<ISerialNumbered> sortedDevices = new TreeSet<ISerialNumbered>(comparator);
        sortedDevices.addAll(getAllDevices());
        return sortedDevices;
    }

    /**
     * Get all devices registered in TmL, sorted using the default comparator
     * 
     * @return all devices registered in TmL, sorted using the default comparator
     */
    public Collection<ISerialNumbered> getAllDevicesSorted()
    {
        return getAllDevices(getDefaultComparator());
    }

    /**
     * Get the device, given its name
     * 
     * @param name the device name
     * @return a device instance
     */
    public ISerialNumbered getDeviceByName(String name)
    {
        ISerialNumbered instanceToReturn = null;

        for (ISerialNumbered device : getAllDevices())
        {
            if (device.getDeviceName().equals(name))
            {
                instanceToReturn = device;
                break;
            }
        }
        return instanceToReturn;

    }

    /**
     * Get the device, given its serial number
     * 
     * @param serial the device serial name
     * @return a device instance
     */
    public ISerialNumbered getDeviceBySerialNumber(String serial)
    {
        ISerialNumbered instanceToReturn = null;

        String serialNumber = "";
        for (ISerialNumbered device : getAllDevices())
        {
            if ((serialNumber = device.getSerialNumber()) != null)
            {
                if (serialNumber.equals(serial))
                {
                    instanceToReturn = device;
                    break;
                }
            }
        }
        return instanceToReturn;

    }

    /**
     * Get all devices of certain type
     * 
     * @param type the device type
     * @return all devices of the device passed as a parameter
     */
    @SuppressWarnings("unchecked")
    public Collection<ISerialNumbered> getInstancesByType(Class type)
    {
        Collection<ISerialNumbered> instancesToReturn = new LinkedHashSet<ISerialNumbered>();

        for (ISerialNumbered device : getAllDevices())
        {
            if (device.getClass().equals(type))
            {
                instancesToReturn.add(device);
            }
        }
        return instancesToReturn;

    }

    /**
     * Get all online devices of certain type
     * 
     * @param type the device type
     * @return all online devices of the device passed as a parameter
     */
    @SuppressWarnings("unchecked")
    public Collection<ISerialNumbered> getOnlineDevicesByType(Class type)
    {
        Collection<ISerialNumbered> instancesToReturn = new HashSet<ISerialNumbered>();

        String serialNumber = null;
        for (ISerialNumbered device : getInstancesByType(type))
        {
            if (((serialNumber = device.getSerialNumber()) != null)
                    && (DDMSFacade.isDeviceOnline(serialNumber)))
            {
                instancesToReturn.add(device);
            }
        }
        return instancesToReturn;

    }

    /**
     * The default comparator to be used to sort ISerialNumbered instances
     * It considers if the devices are online and after that it compares their names
     * Online devices shall be placed in the beginning of the list
     * 
     * @return a Comparator instance
     */
    public static Comparator<ISerialNumbered> getDefaultComparator()
    {
        return new Comparator<ISerialNumbered>()
        {
            public int compare(ISerialNumbered serial1, ISerialNumbered serial2)
            {
                int compareResult;

                String name1 = serial1.getDeviceName();
                String name2 = serial2.getDeviceName();
                boolean dev1online = serial1.getSerialNumber() != null;
                boolean dev2online = serial2.getSerialNumber() != null;

                if ((dev1online && dev2online) || (!dev1online && !dev2online))
                {
                    compareResult = name1.compareToIgnoreCase(name2);
                }
                else if (dev1online)
                {
                    compareResult = -1;
                }
                else
                // dev2online
                {
                    compareResult = 1;
                }

                return compareResult;
            }
        };
    }

    /**
     * Creates a TmL instance
     * 
     * @param serialNumber The serial number of the device to create a TmL instance for
     * @throws TmLException 
     */
    public void createInstanceForDevice(String serialNumber, String deviceTypeID,
            IInstanceBuilder instanceBuilder, String initServiceID) throws SequoyahException
    {

        ISerialNumbered instance = getDeviceBySerialNumber(serialNumber);
        if (instance == null)
        {
            IDeviceType tmlDeviceType =
                    DeviceTypeRegistry.getInstance().getDeviceTypeById(deviceTypeID);

            InstanceManager
                    .createProject(tmlDeviceType, instanceBuilder, new NullProgressMonitor());

            IInstance newInstance = (IInstance) getDeviceBySerialNumber(serialNumber);
            IService service = DeviceUtils.getServiceById(tmlDeviceType, initServiceID);
            IServiceHandler handler = service.getHandler();
            handler.run(newInstance);
        }

    }

    /**
     * Destroys the TmL instance
     * 
     * @param device The device to delete the correspondent TmL instance
     */
    public void deleteInstanceOfDevice(String serialNumber)
    {

        IInstance instanceToDelete = (IInstance) getDeviceBySerialNumber(serialNumber);
        if (instanceToDelete != null)
        {
            InstanceManager.deleteInstance(instanceToDelete);
        }

    }

}
