/*******************************************************************************
 * Copyright (c) 2005, 2017 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.internal.cheatsheets.composite.views;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.internal.cheatsheets.CheatSheetPlugin;
import org.eclipse.ui.internal.cheatsheets.ICheatSheetResource;
import org.eclipse.ui.internal.cheatsheets.Messages;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetRegistryReader;
import org.eclipse.ui.internal.provisional.cheatsheets.TaskExplorer;
import org.osgi.framework.Bundle;

public class TaskExplorerManager {
private static TaskExplorerManager instance;

	private Map<String, Image> images;

	private TaskExplorerManager() {

	}

	public static TaskExplorerManager getInstance() {
		if (instance == null) {
			instance = new TaskExplorerManager();
		}
		return instance;
	}

	public TaskExplorer getExplorer(String explorerKind) {
		CheatSheetRegistryReader.TaskExplorerNode explorerInfo =
			CheatSheetRegistryReader.getInstance().findTaskExplorer(explorerKind);
		if (explorerInfo != null) {
			TaskExplorer explorerInstance = null;
			Class<?> extClass = null;
			String className = explorerInfo.getClassName();
			try {
				Bundle bundle = Platform.getBundle(explorerInfo.getPluginId());
				extClass = bundle.loadClass(className);
			} catch (Exception e) {
				String message = NLS.bind(Messages.ERROR_LOADING_CLASS, (new Object[] {className}));
				Status status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e);
				CheatSheetPlugin.getPlugin().getLog().log(status);
			}
			try {
				if (extClass != null) {
					Constructor<?> c = extClass.getConstructor();
					explorerInstance = (TaskExplorer) c.newInstance();
				}
			} catch (Exception e) {
				String message = NLS.bind(Messages.ERROR_CREATING_CLASS, (new Object[] {className}));
				IStatus status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e);
				CheatSheetPlugin.getPlugin().getLog().log(status);
			}

			return explorerInstance;
		}

		return null;
	}

	private ImageDescriptor getImageDescriptor(String explorerKind) {
		CheatSheetRegistryReader.TaskExplorerNode explorerInfo =
			CheatSheetRegistryReader.getInstance().findTaskExplorer(explorerKind);
		if (explorerInfo == null) {
			return null;
		}
	    String iconPath = explorerInfo.getIconPath();
		if (iconPath == null) {
			return null;
		}
		Bundle bundle = Platform.getBundle(explorerInfo.getPluginId());
		URL url = FileLocator.find(bundle, new Path(iconPath), null);
		try {
			url = FileLocator.resolve(url);
			return ImageDescriptor.createFromURL(url);
		} catch (IOException e) {
			return null;
		}
	}

	private Map<String, Image> getImages() {
		if (images == null) {
			initImages();
		}
		return images;
	}


	private void initImages() {
		if (images == null) {
			images = new HashMap<>();
			String[] ids = CheatSheetRegistryReader.getInstance().getExplorerIds();
			for (int i = 0; i < ids.length; i++) {
				ImageDescriptor descriptor = getImageDescriptor(ids[i]);
				if (descriptor != null) {
					images.put(ids[i], descriptor.createImage());
				}
			}
		}
	}

	public String getName(String explorerKind) {
		CheatSheetRegistryReader.TaskExplorerNode explorerInfo =
			CheatSheetRegistryReader.getInstance().findTaskExplorer(explorerKind);
		if (explorerInfo != null) {
			return explorerInfo.getName();
		}
		return null;
	}

	public Image getImage(String id) {
		return getImages().get(id);
	}

}
