/*
 * Copyright (C) 2003-2007 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 */
package org.exoplatform.services.cms.thumbnail;

import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.util.List;

import javax.jcr.Node;
import javax.jcr.RepositoryException;

import org.exoplatform.container.component.ComponentPlugin;

/**
 * Created by The eXo Platform SARL
 * Author : Dang Van Minh
 *          minh.dang@exoplatform.com
 * Oct 10, 2008 1:59:21 PM
 */
/**
 * This service will be support to create thumbnail for node
 * Get image and any file type in node
 */
public interface ThumbnailService {

  final public static String EXO_THUMBNAILS = "exo:thumbnails";
  final public static String EXO_THUMBNAIL = "exo:thumbnail";
  final public static String SMALL_SIZE = "exo:smallSize";
  final public static String MEDIUM_SIZE = "exo:mediumSize";
  final public static String BIG_SIZE = "exo:bigSize";
  final public static String THUMBNAIL_LAST_MODIFIED = "exo:thumbnailLastModified";
  final public static String EXO_THUMBNAILS_FOLDER = "exo:thumbnails";
  final public static String HIDDENABLE_NODETYPE = "exo:hiddenable";

  /**
   * Return all nt:file node at current node
   * @param node Current node
   * @return all nt:file nodes
   * @throws RepositoryException
   */
  public List<Node> getAllFileInNode(Node node) throws RepositoryException;

  /**
   * Return the list of node in the current node with mimetype specified
   * @param node Current node
   * @param jcrMimeType Mime type of node will be retrieve
   * @return node list
   * @throws Exception
   */
  public List<Node> getFileNodesByType(Node node, String jcrMimeType) throws Exception;
  /**
   * Return a list image in node
   * @param node Current node
   * @return images nodes list
   * @throws Exception
   */
  public List<Node> getFlowImages(Node node) throws Exception;
  /**
   * To setup status of node is allow thumbnail or not
   * @param isEnable
   */
  public void setEnableThumbnail(boolean isEnable);
  /**
   * Return the status of node is enable thumbnail or not
   * @return Boolean value
   */
  public boolean isEnableThumbnail();
  /**
   * Create thumbnail for node with default size:
   * Small size, medium size, big size
   * @param node Current node which will be added thumbnail
   * @param image BufferedImage which contain the original image
   * @param mimeType File type
   * @throws Exception
   */
  public void createThumbnailImage(Node node, BufferedImage image, String mimeType) throws Exception;
  /**
   * Return the data of thumbnail with specified type
   * @param node Current node which will be added thumbnail
   * @param thumbnailType Type of thumbnail will be return (small, medium, big or specified if has)
   * @throws Exception
   */
  public InputStream getThumbnailImage(Node node, String thumbnailType) throws Exception;
  /**
   * Create thumbnail node
   * @param node Current node which included thumbnail
   * @return Node
   * @throws Exception
   */
  public Node addThumbnailNode(Node node) throws Exception;
  /**
   * Get thumbnail node
   * @param node
   * @return Node
   * @throws Exception
   */
  public Node getThumbnailNode(Node node) throws Exception;
  /**
   * Create a thumbnail for node with size specified
   * @param node Current node which will be added thumbnail
   * @param image BufferedImage which contain the original image
   * @param propertyName Data will be set to this property
   * @throws Exception
   */
  public void createSpecifiedThumbnail(Node node, BufferedImage image, String propertyName) throws Exception;
  /**
   * Add a thumbnail image to node
   * @param node Current node which will be added thumbnail
   * @param image BufferedImage which contain the original image
   * @param propertyName Data will be set to this property
   * @throws Exception
   */
  public void addThumbnailImage(Node node, BufferedImage image, String propertyName) throws Exception;
  /**
   * Process thumbnail with list nodes
   * @param listNodes List node which will be process to add thumbnail
   * @param type Type of thumbnail image
   * @throws Exception
   */
  public void processThumbnailList(List<Node> listNodes, String type) throws Exception;
  /**
   * Get mime types which allow to view
   * @return mimetypes list
   */
  public List<String> getMimeTypes();
  /**
   * Process to remove thumbnail
   * @param showingNode Node contain the thumbnail
   * @throws Exception
   */
  public void processRemoveThumbnail(Node showingNode) throws Exception;

  /**
   * Copy thumbnail node to destination node after moving or copy/paste.
   *
   * @param srcThumbnailNode thumbnailNode of source node
   * @param destNode destination Node
   * @throws Exception
   */
  public void copyThumbnailNode(Node srcThumbnailNode, Node destNode) throws Exception;

  /**
   * Add Thumbnail Plugin
   * @param plugin ComponentPlugin
   */
  public void addPlugin(ComponentPlugin plugin);

  /**
   * Return a list of Thumbnail plugin
   * @return ComponentPlugin list
   */
  public List<ComponentPlugin> getComponentPlugins();

  /**
   * Creates a thumbnail with custom provided width and height
   *
   * @param imageContent original image content
   * @param targetWidth target resized image width
   * @param targetHeight target resized image height
   * @return byte array of image content
   */
  byte[] createCustomThumbnail(byte [] imageContent, int targetWidth, int targetHeight, String mimeType) throws Exception;
}
