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

import java.util.ArrayList;
import java.util.List;

import org.exoplatform.faq.service.JCRPageList;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;

@ComponentConfig(
    template = "app:/templates/answer/webui/UIAnswersPageIterator.gtmpl",
    events = { @EventConfig(listeners = UIAnswersPageIterator.GoPageActionListener.class) }
)
public class UIAnswersPageIterator extends UIContainer {
  private JCRPageList pageList     = null;

  private long        page         = 1;

  private int         endTabPage   = 0;

  private int         beginTabPage = 0;

  public UIAnswersPageIterator() throws Exception {
  }

  public void updatePageList(JCRPageList pageList) {
    this.pageList = pageList;
    page = 1;
    endTabPage = 0;
    beginTabPage = 0;
  }

  protected List<String> getTotalpage() throws Exception {
    int max_Page = 1;
    if (pageList != null)
      max_Page = (int) pageList.getAvailablePage();
    if (this.page > max_Page)
      this.page = max_Page;
    long page = this.page;
    if (page <= 3) {
      beginTabPage = 1;
      if (max_Page <= 7)
        endTabPage = max_Page;
      else
        endTabPage = 7;
    } else {
      if (max_Page > (page + 3)) {
        endTabPage = (int) (page + 3);
        beginTabPage = (int) (page - 3);
      } else {
        endTabPage = max_Page;
        if (max_Page > 7)
          beginTabPage = max_Page - 6;
        else
          beginTabPage = 1;
      }
    }
    List<String> temp = new ArrayList<String>();
    for (int i = beginTabPage; i <= endTabPage; i++) {
      temp.add("" + i);
    }
    return temp;
  }

  public List<Long> getInfoPage() throws Exception {
    List<Long> temp = new ArrayList<Long>();
    if (pageList != null) {
      temp.add(pageList.getPageSize());// so item/trang
      temp.add(pageList.getCurrentPage());// so trang hien tai
      temp.add(pageList.getAvailable());// tong so item
      temp.add(pageList.getAvailablePage());// so trang toi da
    } else {
      temp.add((long) 0);
      temp.add((long) 1);
      temp.add((long) 0);
      temp.add((long) 1);
    }
    return temp;
  }

  public void setSelectPage(long page) {
    this.page = page;
  }

  public long getPageSelected() {
    return this.page;
  }

  static public class GoPageActionListener extends EventListener<UIAnswersPageIterator> {
    public void execute(Event<UIAnswersPageIterator> event) throws Exception {
      UIAnswersPageIterator faqPageIterator = event.getSource();
      String stateClick = event.getRequestContext().getRequestParameter(OBJECTID).trim();
      long maxPage = faqPageIterator.pageList.getAvailablePage();
      long presentPage = faqPageIterator.page;
      if (stateClick.equalsIgnoreCase("next")) {
        if (presentPage < maxPage) {
          faqPageIterator.page = presentPage + 1;
        }
      } else if (stateClick.equalsIgnoreCase("previous")) {
        if (presentPage > 1) {
          faqPageIterator.page = presentPage - 1;
        }
      } else if (stateClick.equalsIgnoreCase("last")) {
        if (presentPage != maxPage) {
          faqPageIterator.page = maxPage;
        }
      } else if (stateClick.equalsIgnoreCase("first")) {
        if (presentPage != 1) {
          faqPageIterator.page = 1;
        }
      } else {
        long temp = Long.parseLong(stateClick);
        if (temp > 0 && temp <= maxPage && temp != presentPage) {
          faqPageIterator.page = temp;
        }
      }
      event.getRequestContext().addUIComponentToUpdateByAjax(faqPageIterator.getParent());
    }
  }
}
