/*
 * Copyright (C) 2003-2008 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.views;

import java.util.List;
import java.util.Set;

import javax.jcr.Node;

import org.exoplatform.services.cms.views.PortletTemplatePlugin.PortletTemplateConfig;
import org.exoplatform.services.jcr.ext.common.SessionProvider;

  /**
   * Manages dynamic Groovy templates for the WCM-based products.
   * All templates created by this service need to be stored in hierarchical context.<br>
   * For example:<br>
   * application 1 <br>
   *    /category 1 <br>
   *       /template 1 <br>
   *       /template 2 <br>
   *    /category 2
   *
   * @LevelAPI Experimental
   */
public interface ApplicationTemplateManagerService {

  public final static String CLV_PAGINATOR_TEMPLATE_CATEGORY             = "paginators";
  
  public final static String CLV_NAVIGATION_TEMPLATE_CATEGORY             = "navigation";
  
  public final static String CLV_LIST_TEMPLATE_CATEGORY             = "list";
  
  public final static String CLV_TEMPLATE_STORAGE_FOLDER                 = "content-list-viewer";

  /**
   * Adds a plugin.
   *
   * @param portletTemplatePlugin The portlet template plugin to be added.
   * @throws Exception The exception
   */
  public void addPlugin(PortletTemplatePlugin portletTemplatePlugin) throws Exception;

  /**
   * Gets all portlet names that have dynamic Groovy templates managed by the service.
   *
   * @param repository Name of the repository.
   * @return All managed portlet names.
   * @throws Exception The exception
   */
  public List<String> getAllManagedPortletName(String repository) throws Exception;

  /**
   * Gets templates under a given category.
   *
   * @param portletName Name of the portet that contains the given category.
   * @param category The given category.
   * @param sessionProvider The session provider.
   * @return The templates.
   * @throws Exception The exception
   */
  public List<Node> getTemplatesByCategory(String portletName,
                                           String category,
                                           SessionProvider sessionProvider) throws Exception;

  /**
   * Gets a template by its name under a given category.
   *
   * @param portletName Name of the portet that contains the given category.
   * @param category The given category.
   * @param templateName Name of the template.
   * @param sessionProvider The session provider.
   * @return The template.
   * @throws Exception The exception
   */
  public Node getTemplateByName(String portletName,
                                String category,
                                String templateName,
                                SessionProvider sessionProvider) throws Exception;

  /**
   * Gets a template by its path under a given category.
   * 
   * @param templatePath Path of the template.
   * @param sessionProvider The session provider.
   * @return The template.
   * @throws Exception The exception
   */
  public Node getTemplateByPath(String templatePath, SessionProvider sessionProvider) throws Exception;

  /**
   * Adds a template to the portlet template home.
   *
   * @param portletTemplateHome The portlet template home.
   * @param config Configuration of the portlet template.
   * @throws Exception The exception
   */
  public void addTemplate(Node portletTemplateHome, PortletTemplateConfig config) throws Exception;

  /**
   * Removes a template from a given portlet.
   *
   * @param portletName Name of the given portlet.
   * @param catgory Category of the template which needs to be removed.
   * @param templateName Name of the removed template.
   * @param sessionProvider The session provider.
   * @throws Exception The exception
   */
  public void removeTemplate(String portletName,
                             String catgory,
                             String templateName,
                             SessionProvider sessionProvider) throws Exception;
  
  /**
   * Gets the application template home.
   *
   * @param portletName Name of the portlet.
   * @param provider The session provider.
   * @return The application template home.
   * @throws Exception The exception
   */
  public Node getApplicationTemplateHome(String portletName, SessionProvider provider) throws Exception;
  
  /**
   * Gets all configured templates of a given portlet.
   *
   * @param portletName Name of the given portlet.
   * @return Set of configured templates.
   */
  public Set<String> getConfiguredAppTemplateMap(String portletName);

}
