/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.hdt.ui;

import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.Bundle;

/**
 * Icons manager
 */
public class ImageLibrary {

  private final Bundle bundle = Activator.getDefault().getBundle();

  /**
   * Singleton instance
   */
  private static volatile ImageLibrary instance = null;

  private ISharedImages sharedImages =
      PlatformUI.getWorkbench().getSharedImages();

  /**
   * Where resources (icons, images...) are available in the Bundle
   */
  private static final String RESOURCE_DIR = "resources/";

  /**
   * Public access to image descriptors
   * 
   * @param name
   * @return the image descriptor
   */
  public static ImageDescriptor get(String name) {
    return getInstance().getImageDescriptorByName(name);
  }

  /**
   * Public access to images
   * 
   * @param name
   * @return the image
   */
  public static Image getImage(String name) {
    return getInstance().getImageByName(name);
  }

  /**
   * Singleton access
   * 
   * @return the Image library
   */
  public static ImageLibrary getInstance() {
    if (instance == null) {
      synchronized (ImageLibrary.class) {
        if (instance == null)
          instance = new ImageLibrary();
      }
    }
    return instance;
  }

  /**
   * Map of registered resources (ImageDescriptor and Image)
   */
  private Map<String, ImageDescriptor> descMap =
      new HashMap<String, ImageDescriptor>();

  private Map<String, Image> imageMap = new HashMap<String, Image>();

  /**
   * Image library constructor: put image definitions here.
   */
  private ImageLibrary() {
    /*
     * Servers view
     */
    newImage("server.view.location.entry", "Elephant-24x24.png");
    newImage("server.view.job.entry", "job.gif");
    newImage("server.view.action.location.new", "location-new-16x16.png");
    newImage("server.view.action.location.edit", "location-edit-16x16.png");
    newSharedImage("server.view.action.delete",
        ISharedImages.IMG_TOOL_DELETE);

    /*
     * DFS Browser
     */
    newImage("dfs.browser.root.entry", "files.gif");
    newImage("dfs.browser.location.entry", "Elephant-16x16.png");
    newSharedImage("dfs.browser.folder.entry", ISharedImages.IMG_OBJ_FOLDER);
    newSharedImage("dfs.browser.file.entry", ISharedImages.IMG_OBJ_FILE);
    // DFS files in editor
    newSharedImage("dfs.file.editor", ISharedImages.IMG_OBJ_FILE);
    // Actions
    newImage("dfs.browser.action.mkdir", "new-folder.png");
    newImage("dfs.browser.action.download", "download.png");
    newImage("dfs.browser.action.upload_files", "upload.png");
    newImage("dfs.browser.action.upload_dir", "upload.png");
    newSharedImage("dfs.browser.action.delete",
        ISharedImages.IMG_TOOL_DELETE);
    newImage("dfs.browser.action.refresh", "refresh.png");

    /*
     * Wizards
     */
    newImage("wizard.mapper.new", "mapwiz.png");
    newImage("wizard.reducer.new", "reducewiz.png");
    newImage("wizard.driver.new", "driverwiz.png");
    newImage("wizard.mapreduce.project.new", "projwiz.png");
  }

  /**
   * Accessor to images
   * 
   * @param name
   * @return
   */
  private ImageDescriptor getImageDescriptorByName(String name) {
    return this.descMap.get(name);
  }

  /**
   * Accessor to images
   * 
   * @param name
   * @return
   */
  private Image getImageByName(String name) {
    return this.imageMap.get(name);
  }

  /**
   * Access to platform shared images
   * 
   * @param name
   * @return
   */
  private ImageDescriptor getSharedByName(String name) {
    return sharedImages.getImageDescriptor(name);
  }

  /**
   * Load and register a new image. If the image resource does not exist or
   * fails to load, a default "error" resource is supplied.
   * 
   * @param name name of the image
   * @param filename name of the file containing the image
   * @return whether the image has correctly been loaded
   */
  private boolean newImage(String name, String filename) {
    ImageDescriptor id;
    boolean success;

    try {
      URL fileURL =
          FileLocator.find(bundle, new Path(RESOURCE_DIR + filename), null);
      id = ImageDescriptor.createFromURL(FileLocator.toFileURL(fileURL));
      success = true;

    } catch (Exception e) {

      e.printStackTrace();
      id = ImageDescriptor.getMissingImageDescriptor();
      // id = getSharedByName(ISharedImages.IMG_OBJS_ERROR_TSK);
      success = false;
    }

    descMap.put(name, id);
    imageMap.put(name, id.createImage(true));

    return success;
  }

  /**
   * Register an image from the workspace shared image pool. If the image
   * resource does not exist or fails to load, a default "error" resource is
   * supplied.
   * 
   * @param name name of the image
   * @param sharedName name of the shared image ({@link ISharedImages})
   * @return whether the image has correctly been loaded
   */
  private boolean newSharedImage(String name, String sharedName) {
    boolean success = true;
    ImageDescriptor id = getSharedByName(sharedName);

    if (id == null) {
      id = ImageDescriptor.getMissingImageDescriptor();
      // id = getSharedByName(ISharedImages.IMG_OBJS_ERROR_TSK);
      success = false;
    }

    descMap.put(name, id);
    imageMap.put(name, id.createImage(true));

    return success;
  }

  /**
   * Register an image from the workspace shared image pool. If the image
   * resource does not exist or fails to load, a default "error" resource is
   * supplied.
   * 
   * @param name name of the image
   * @param sharedName name of the shared image ({@link ISharedImages})
   * @return whether the image has correctly been loaded
   */
  private boolean newPluginImage(String name, String pluginId,
      String filename) {

    boolean success = true;
    ImageDescriptor id =
        AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, filename);

    if (id == null) {
      id = ImageDescriptor.getMissingImageDescriptor();
      // id = getSharedByName(ISharedImages.IMG_OBJS_ERROR_TSK);
      success = false;
    }

    descMap.put(name, id);
    imageMap.put(name, id.createImage(true));

    return success;
  }
}
