package net.sf.taverna.biocatalogue.model;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.HashMap;

import javax.swing.Icon;
import javax.swing.ImageIcon;

import net.sf.taverna.t2.activities.rest.ui.servicedescription.RESTActivityIcon;
import net.sf.taverna.t2.activities.wsdl.servicedescriptions.WSDLActivityIcon;
import net.sf.taverna.t2.ui.perspectives.biocatalogue.BioCataloguePerspective;

/**
 * This class will be a single point of lookup of all resource files.
 * (Icons, images, CSS files, etc).
 * 
 * @author Sergejs Aleksejevs
 */
public class ResourceManager
{
  // subfolders, where some icons / other resources are kept
  public static final String FAMFAMFAM_PATH = "famfamfam_silk/";    // free collection of icons
  public static final String SERVICE_ICONS_PATH = "service_icons/"; // icons related to web services (e.g. service types)
  public static final String FOLDS_PATH = "folds/";                 // icons for 'folding' menus (like 'Search for...')
  public static final String TRISTATE_TREE_ICONS_PATH = "tristate_checkbox/";  // icons for the tri-state filtering tree
  
  // all known resources to follow
  public static final int FAVICON = 1;
  
  public static final int INFORMATION_ICON_LARGE = 10;
  
  public static final int SPINNER_STILL = 20;
  public static final int SPINNER = 21;
  public static final int BAR_LOADER_GREY = 25;
  public static final int BAR_LOADER_GREY_STILL = 26;
  public static final int BAR_LOADER_ORANGE = 30;
  public static final int BAR_LOADER_ORANGE_STILL = 31;
  
  public static final int FOLD_ICON = 40;
  public static final int UNFOLD_ICON = 41;
  public static final int FOLD_ICON_16x16 = 42;
  public static final int UNFOLD_ICON_16x16 = 43;
  
  public static final int SERVICE_TYPE_SOAP_ICON = 50;
  public static final int SERVICE_TYPE_REST_ICON = 51;
  public static final int SERVICE_TYPE_MULTITYPE_ICON = 65;
  public static final int SERVICE_TYPE_UNKNOWN_ICON = 70;
  
  public static final int TRISTATE_CHECKBOX_CHECKED_ICON = 80;
  public static final int TRISTATE_CHECKBOX_PARTIAL_ICON = 82;
  public static final int TRISTATE_CHECKBOX_UNCHECKED_ICON = 85;
  public static final int UNCHECKED_ICON = 86;
  
  public static final int SERVICE_STATUS_PASSED_ICON = 100;
  public static final int SERVICE_STATUS_PASSED_ICON_LARGE = 101;
  public static final int SERVICE_STATUS_WARNING_ICON = 110;
  public static final int SERVICE_STATUS_WARNING_ICON_LARGE = 111;
  public static final int SERVICE_STATUS_FAILED_ICON = 120;
  public static final int SERVICE_STATUS_FAILED_ICON_LARGE = 121;
  public static final int SERVICE_STATUS_UNCHECKED_ICON = 130;
  public static final int SERVICE_STATUS_UNCHECKED_ICON_LARGE = 131;
  public static final int SERVICE_STATUS_UNKNOWN_ICON = 140;
  
  public static final int UNKNOWN_RESOURCE_TYPE_ICON = 200;
  public static final int USER_ICON = 205;
  public static final int REGISTRY_ICON = 210;
  public static final int SERVICE_PROVIDER_ICON = 215;
  public static final int SERVICE_ICON = 220;
  public static final int SOAP_OPERATION_ICON = 225;
  public static final int REST_METHOD_ICON = 227;
  public static final int SERVICE_CATEGORY_ICON = 230;
  public static final int WSDL_DOCUMENT_ICON = 235;
  public static final int TAG_ICON = 240;
  
  public static final int OPEN_IN_BIOCATALOGUE_ICON = 310;
  public static final int SEARCH_ICON = 315;
  public static final int HISTORY_ICON = 320;
  public static final int REFRESH_ICON = 330;
  public static final int FAVOURITE_ICON = 335;
  public static final int TICK_ICON = 340;
  public static final int CROSS_ICON = 341;
  public static final int WARNING_ICON = 342;
  public static final int ERROR_ICON = 343;
  public static final int SAVE_ICON = 345;
  public static final int DELETE_ITEM_ICON = 350;
  public static final int CLEAR_ICON = 355;
  public static final int LOCKED_ICON = 360;
  public static final int UNLOCKED_ICON = 365;
  
  public static final int BACK_ICON = 370;
  public static final int FORWARD_ICON = 375;
  public static final int FILTER_ICON = 380;
  public static final int PREVIEW_ICON = 385;
  public static final int SUGGESTION_TO_USER_ICON = 390;
  public static final int ADD_PROCESSOR_TO_WORKFLOW_ICON = 395;
  public static final int ADD_PROCESSOR_AS_FAVOURITE_ICON = 396;
  public static final int EXECUTE_HEALTH_CHECK_ICON = 397;
  public static final int ADD_ALL_SERVICES_AS_FAVOURITE_ICON = 398;

  public static final int SELECT_ALL_ICON = 400;
  public static final int DESELECT_ALL_ICON = 405;
  public static final int EXPAND_ALL_ICON = 410;
  public static final int COLLAPSE_ALL_ICON = 420;
  
  public static final int SORT_BY_NAME_ICON = 450;
  public static final int SORT_BY_COUNTS_ICON = 455;
  
  public static final int STYLES_CSS = 1000;
  
  
  /** 
   * Simple method to retrieve relative path of a required resource.
   */
  public static String getResourceRelPath(int resourceId)
  {
    String resPath = "";
    
    switch (resourceId) {
      case FAVICON:                           resPath += "favicon.png";
                                              break;
      case INFORMATION_ICON_LARGE:            resPath += "info-sphere-35.png";
                                              break;
      case SPINNER_STILL:                     resPath += "ajax-loader-still.gif";
                                              break;
      case SPINNER:                           resPath += "ajax-loader.gif";
                                              break;
      case BAR_LOADER_GREY:                   resPath += "ajax-loader-grey-bert2.gif";
                                              break;
      case BAR_LOADER_GREY_STILL:             resPath += "ajax-loader-grey-bert2-still.png";
                                              break;
      case BAR_LOADER_ORANGE:                 resPath += "ajax-loader-orange-bert2.gif";
                                              break;
      case BAR_LOADER_ORANGE_STILL:           resPath += "ajax-loader-orange-bert2-still.png";
                                              break;
      case FOLD_ICON:                         resPath += FOLDS_PATH + "fold.png";
                                              break;
      case UNFOLD_ICON:                       resPath += FOLDS_PATH + "unfold.png";
      										  break;
      case FOLD_ICON_16x16:                   resPath += FOLDS_PATH + "fold_16x16.png";
      										  break;
      case UNFOLD_ICON_16x16:                 resPath += FOLDS_PATH + "unfold_16x16.png";                                              
      										  break;
      case SERVICE_TYPE_SOAP_ICON:            resPath += SERVICE_ICONS_PATH + "service_type_soap.png";
                                              break;
      case SERVICE_TYPE_REST_ICON:            resPath += SERVICE_ICONS_PATH + "service_type_rest.png";
                                              break;
      case SERVICE_TYPE_MULTITYPE_ICON:       resPath += SERVICE_ICONS_PATH + "service_type_multitype.png";
                                              break;
      case SERVICE_TYPE_UNKNOWN_ICON:         resPath += SERVICE_ICONS_PATH + "service_type_unknown.png";
                                              break;
      case SERVICE_STATUS_PASSED_ICON:        resPath += FAMFAMFAM_PATH + "accept.png";
                                              break;
      case SERVICE_STATUS_PASSED_ICON_LARGE:  resPath += "tick-sphere-35.png";
                                              break;
      case SERVICE_STATUS_WARNING_ICON:       resPath += FAMFAMFAM_PATH + "error.png";
                                              break;
      case SERVICE_STATUS_WARNING_ICON_LARGE: resPath += "pling-sphere-35.png";
                                              break;
      case SERVICE_STATUS_FAILED_ICON:        resPath += FAMFAMFAM_PATH + "exclamation.png";
                                              break;
      case SERVICE_STATUS_FAILED_ICON_LARGE:  resPath += "cross-sphere-35.png";
                                              break;
      case SERVICE_STATUS_UNCHECKED_ICON:     resPath += FAMFAMFAM_PATH + "help.png";
                                              break;
      case SERVICE_STATUS_UNCHECKED_ICON_LARGE: resPath += "query-sphere-35.png";
                                              break;
      case SERVICE_STATUS_UNKNOWN_ICON:       resPath += FAMFAMFAM_PATH + "grey_circle.png";
                                              break;
      case TRISTATE_CHECKBOX_CHECKED_ICON:    resPath += TRISTATE_TREE_ICONS_PATH + "tristate_checkbox_checked.png";
                                              break;
      case TRISTATE_CHECKBOX_PARTIAL_ICON:    resPath += TRISTATE_TREE_ICONS_PATH + "tristate_checkbox_partial.png";
                                              break;
      case TRISTATE_CHECKBOX_UNCHECKED_ICON:  resPath += TRISTATE_TREE_ICONS_PATH + "tristate_checkbox_unchecked.png";
                                              break;
      case UNCHECKED_ICON:  				  resPath += "unchecked.png";
      										  break;
      case UNKNOWN_RESOURCE_TYPE_ICON:        resPath += FAMFAMFAM_PATH + "grey_circle.png";
                                              break;                                        
      case USER_ICON:                         resPath += FAMFAMFAM_PATH + "user.png";
                                              break;
      case REGISTRY_ICON:                     resPath += FAMFAMFAM_PATH + "remote_resource.png";
                                              break;
      case SERVICE_PROVIDER_ICON:             resPath += FAMFAMFAM_PATH + "chart_organisation.png";
                                              break;
      case SERVICE_ICON:                      resPath += "favicon.png";
                                              break;
      case SOAP_OPERATION_ICON:               resPath += FAMFAMFAM_PATH + "plugin.png";
                                              break;
      case REST_METHOD_ICON:                  resPath += FAMFAMFAM_PATH + "plugin.png";
                                              break;
      case SERVICE_CATEGORY_ICON:             resPath += FAMFAMFAM_PATH + "text_list_numbers.png";
                                              break;
      case TAG_ICON:                          resPath += FAMFAMFAM_PATH + "tag_blue.png";
                                              break;
      case WSDL_DOCUMENT_ICON:                resPath += FAMFAMFAM_PATH + "page_white_code.png";
                                              break;                                        
      case OPEN_IN_BIOCATALOGUE_ICON:         resPath += FAMFAMFAM_PATH + "magnifier.png";
                                              break;
      case SEARCH_ICON:                       resPath += FAMFAMFAM_PATH + "magnifier.png";
                                              break;
      case HISTORY_ICON:                      resPath += FAMFAMFAM_PATH + "folder_explore.png";
                                              break;
      case REFRESH_ICON:                      resPath += FAMFAMFAM_PATH + "arrow_refresh.png";
                                              break;
      case FAVOURITE_ICON:                    resPath += FAMFAMFAM_PATH + "star.png";
                                              break;
      case TICK_ICON:                         resPath += FAMFAMFAM_PATH + "tick.png";
                                              break;
      case CROSS_ICON:                        resPath += FAMFAMFAM_PATH + "cross.png";
                                              break;
      case WARNING_ICON:                      resPath += FAMFAMFAM_PATH + "error.png";
                                              break;
      case ERROR_ICON:                        resPath += FAMFAMFAM_PATH + "exclamation.png";
                                              break;
      case SAVE_ICON:                         resPath += FAMFAMFAM_PATH + "disk.png";
                                              break;
      case DELETE_ITEM_ICON:                  resPath += FAMFAMFAM_PATH + "cross.png";
                                              break;
      case CLEAR_ICON:                        resPath += "trash.png";
                                              break;
      case LOCKED_ICON:                       resPath += FAMFAMFAM_PATH + "lock.png";
                                              break;
      case UNLOCKED_ICON:                     resPath += FAMFAMFAM_PATH + "lock_open.png";
                                              break;
      case BACK_ICON:                         resPath += FAMFAMFAM_PATH + "arrow_left.png";
                                              break;
      case FORWARD_ICON:                      resPath += FAMFAMFAM_PATH + "arrow_right.png";
                                              break;
      case FILTER_ICON:                       resPath += FAMFAMFAM_PATH + "arrow_join (flipped vertically).png";
                                              break;
      case PREVIEW_ICON:                      resPath += FAMFAMFAM_PATH + "magnifier.png";
                                              break;
      case SUGGESTION_TO_USER_ICON:           resPath += FAMFAMFAM_PATH + "lightbulb.png";
                                              break;
      case ADD_PROCESSOR_TO_WORKFLOW_ICON:    resPath += "open_in_BioCatalogue.png";
                                              break;
      case ADD_PROCESSOR_AS_FAVOURITE_ICON:   resPath += FAMFAMFAM_PATH + "star.png";
                                              break;
      case ADD_ALL_SERVICES_AS_FAVOURITE_ICON:resPath += FAMFAMFAM_PATH + "multiple_star.png";
      										  break;                          
      case EXECUTE_HEALTH_CHECK_ICON:         resPath += FAMFAMFAM_PATH + "information.png";
                                              break;                                        
      case SELECT_ALL_ICON:                   resPath += FAMFAMFAM_PATH + "tick.png";
                                              break;
      case DESELECT_ALL_ICON:                 resPath += FAMFAMFAM_PATH + "cross.png";
                                              break;
      case EXPAND_ALL_ICON:                   resPath += FAMFAMFAM_PATH + "text_linespacing.png";
                                              break;
      case COLLAPSE_ALL_ICON:                 resPath += FAMFAMFAM_PATH + "text_linespacing (collapse).png";
                                              break;
      case SORT_BY_NAME_ICON:                 resPath += FAMFAMFAM_PATH + "style.png";
                                              break;
      case SORT_BY_COUNTS_ICON:               resPath += FAMFAMFAM_PATH + "sum.png";
                                              break;
      case STYLES_CSS:                        resPath += "styles.css";
                                              break;
      default:                                return (null);
    }
    
    return (resPath);
  }
  
  
  private static URL getResourceLocalURL(int resourceId) {
    return (BioCataloguePerspective.class.getResource(getResourceRelPath(resourceId)));
  }
  
  private static HashMap<Integer, ImageIcon> iconMap = new HashMap<Integer, ImageIcon>();
  
  public static ImageIcon getImageIcon(int iconId)
  {
	  ImageIcon result = iconMap.get(iconId);
	  if (result == null) {
		  result = new ImageIcon(getResourceLocalURL(iconId));
		  iconMap.put(iconId, result);
	  }
	  return result;
  }
  
  public static ImageIcon getImageIcon(URL resourceLocalURL) {
    return (new ImageIcon(resourceLocalURL));
  }
  
  
  public static Icon getIconFromTaverna(int iconId) {
    switch (iconId) {
      case SOAP_OPERATION_ICON: return (WSDLActivityIcon.getWSDLIcon());
      case REST_METHOD_ICON:    return (RESTActivityIcon.getRESTActivityIcon());
      default:                  return (drawMissingIcon());
    }
  }
  
  
  /**
   * This method would be called by other methods in this class
   * when they were unable to load requested icon.
   * 
   * @return A 16x16 pixel icon that represents a missing icon -
   *         a red cross. 
   */
  private static ImageIcon drawMissingIcon()
  {
    int w = 16;
    int h = 16;
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = ge.getDefaultScreenDevice();
    GraphicsConfiguration gc = gd.getDefaultConfiguration();
    
    BufferedImage image = gc.createCompatibleImage(w, h, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = image.createGraphics();
    g.setColor(Color.RED);
    g.setStroke(new BasicStroke(3, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER));
    g.drawLine(4, 4, 12, 12);
    g.drawLine(12, 4, 4, 12);
    g.dispose();
    
    return new ImageIcon(image); 
  }
}
