/*
 * 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.wcm.webui.paginator;

import javax.faces.lifecycle.Lifecycle;

import org.exoplatform.commons.exception.ExoMessageException;
import org.exoplatform.resolver.ResourceResolver;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;

/**
 * Created by The eXo Platform SAS
 * Author : Hoa Pham
 * hoa.phamvu@exoplatform.com
 * Oct 23, 2008
 */
@ComponentConfig(
    lifecycle = Lifecycle.class,
    events = @EventConfig(listeners = UICustomizeablePaginator.ShowPageActionListener.class )
)
public class UICustomizeablePaginator extends UIPageIterator {

  private static final Log LOG = ExoLogger.getLogger(UICustomizeablePaginator.class.getName());
  
  /** The template path. */
  private String templatePath;

  /** The resource resolver. */
  private ResourceResolver resourceResolver;

  /** Page Mode */
  private String pageMode;

  /**
   * Instantiates a new uI customizeable paginator.
   */
  public UICustomizeablePaginator() {
  }

  /**
   * Gets the total pages.
   *
   * @return the total pages
   */
  public int getTotalPages() { return getPageList().getAvailablePage(); }

  /**
   * Gets the total items.
   *
   * @return the total items
   */
  public int getTotalItems() { return getPageList().getAvailable(); }

  /**
   * Gets the item per page.
   *
   * @return the item per page
   */
  public int getItemPerPage() { return getPageList().getPageSize(); }

  /**
   * Inits the.
   *
   * @param resourceResolver the resource resolver
   * @param templatePath the template path
   */
  public void init(ResourceResolver resourceResolver, String templatePath) {
    this.resourceResolver = resourceResolver;
    this.templatePath = templatePath;
  }

  /**
   * Sets the template path.
   *
   * @param path the new template path
   */
  public void setTemplatePath(String path) { this.templatePath = path; }

  /**
   * Sets the resource resolver.
   *
   * @param resolver the new resource resolver
   */
  public void setResourceResolver(ResourceResolver resolver) { this.resourceResolver = resolver; }

  /* (non-Javadoc)
   * @see org.exoplatform.webui.core.UIComponent#getTemplate()
   */
  public String getTemplate() {
    if(templatePath != null)
      return templatePath;
    return super.getTemplate();
  }

  /**
   * gets the page mode (none, more or pagination)
   * @return PageMode
   */
  public String getPageMode() {
    return pageMode;
  }

  /**
   * sets the page mode (none, more or pagination)
   *
   * @param pageMode
   */
  public void setPageMode(String pageMode) {
    this.pageMode = pageMode;
  }
  
  /*
   * (non-Javadoc)
   * @see
   * org.exoplatform.webui.core.UIComponent#getTemplateResourceResolver(org.
   * exoplatform.webui.application.WebuiRequestContext, java.lang.String)
   */
  public ResourceResolver getTemplateResourceResolver(WebuiRequestContext context,String template) {
    if(resourceResolver != null)
      return resourceResolver;
    return super.getTemplateResourceResolver(context,template);
  }

  /**
   * The listener interface for receiving showPageAction events.
   * The class that is interested in processing a showPageAction
   * event implements this interface, and the object created
   * with that class is registered with a component using the
   * component's <code>addShowPageActionListener<code> method. When
   * the showPageAction event occurs, that object's appropriate
   * method is invoked.
   *
   */
  static  public class ShowPageActionListener extends EventListener<UICustomizeablePaginator> {

    /* (non-Javadoc)
     * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
     */
    public void execute(Event<UICustomizeablePaginator> event) throws Exception {
      UICustomizeablePaginator uiPaginator = event.getSource() ;
      int page = Integer.parseInt(event.getRequestContext().getRequestParameter(OBJECTID)) ;
      try {
        uiPaginator.setCurrentPage(page) ;
      } catch (ExoMessageException e) {
        if (LOG.isWarnEnabled()) {
          LOG.warn(e.getMessage());
        }
      }
      UIComponent parent = uiPaginator.getParent();
      if(parent == null) return ;
      event.getRequestContext().addUIComponentToUpdateByAjax(parent);
      parent.broadcast(event,event.getExecutionPhase());
    }
  }
}
