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

import java.util.List;

import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.ForumPrivateMessage;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.service.JCRPageList;
import org.exoplatform.forum.service.UserProfile;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.webui.UIForumPageIterator;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.ks.common.webui.UIPopupAction;
import org.exoplatform.ks.common.webui.UIPopupContainer;
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;

/**
 * Created by The eXo Platform SAS
 * Author : Vu Duy Tu
 *          tu.duy@exoplatform.com
 * Jun 3, 2008 - 9:48:51 AM  
 */
@ComponentConfig(
    template = "app:/templates/forum/webui/popup/UIListInBoxPrivateMessage.gtmpl",
    events = {
      @EventConfig(listeners = UIListInBoxPrivateMessage.ViewMessageActionListener.class),
      @EventConfig(listeners = UIListInBoxPrivateMessage.DeleteMessageActionListener.class,confirm="UIPrivateMessageForm.confirm.Delete-message"),
      @EventConfig(listeners = UIListInBoxPrivateMessage.ReplyMessageActionListener.class)
    }
)
public class UIListInBoxPrivateMessage extends UIContainer {
  private ForumService              forumService;

  private UserProfile               userProfile      = null;

  private List<ForumPrivateMessage> listInbox        = null;

  private String                    userName         = ForumUtils.EMPTY_STR;

  private boolean                   isRenderIterator = false;

  public UIListInBoxPrivateMessage() throws Exception {
    forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class);
    addChild(UIForumPageIterator.class, null, "PageListInBoxMessage");
  }

  @SuppressWarnings("unused")
  private UserProfile getUserProfile() throws Exception {
    if (userProfile == null) {
      userProfile = this.getAncestorOfType(UIForumPortlet.class).getUserProfile();
    }
    this.userName = userProfile.getUserId();
    return userProfile;
  }

  @SuppressWarnings("unused")
  private boolean isRenderIterator() {
    return isRenderIterator;
  }

  @SuppressWarnings( { "unused", "unchecked" })
  private List<ForumPrivateMessage> getListInBoxPrivateMessage() throws Exception {
    JCRPageList pageList = this.forumService.getPrivateMessage(userName, Utils.RECEIVE_MESSAGE);
    UIForumPageIterator forumPageIterator = this.getChild(UIForumPageIterator.class);
    forumPageIterator.updatePageList(pageList);
    pageList.setPageSize(10);
    int page = forumPageIterator.getPageSelected();
    this.listInbox = pageList.getPage(page);
    if (pageList.getAvailable() > 10) {
      isRenderIterator = true;
    }
    return this.listInbox;
  }

  @SuppressWarnings("unused")
  private ForumPrivateMessage getPrivateMessage(String id) throws Exception {
    List<ForumPrivateMessage> list = this.listInbox;
    for (ForumPrivateMessage forumPrivateMessage : list) {
      if (forumPrivateMessage.getId().equals(id))
        return forumPrivateMessage;
    }
    return null;
  }

  static public class ViewMessageActionListener extends EventListener<UIListInBoxPrivateMessage> {
    public void execute(Event<UIListInBoxPrivateMessage> event) throws Exception {
      UIListInBoxPrivateMessage uicontainer = event.getSource();
      String objctId = event.getRequestContext().getRequestParameter(OBJECTID);
      if (!ForumUtils.isEmpty(objctId)) {
        UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
        try {
          uicontainer.forumService.saveReadMessage(objctId, uicontainer.userName, Utils.RECEIVE_MESSAGE);
          ForumPrivateMessage privateMessage = uicontainer.getPrivateMessage(objctId);
          UIPopupContainer popupContainer = uicontainer.getAncestorOfType(UIPopupContainer.class);
          UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class);
          UIViewPrivateMessageForm privateMessageForm = popupAction.activate(UIViewPrivateMessageForm.class, 650);
          privateMessageForm.setPrivateMessage(privateMessage);
          event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer);
          forumPortlet.getUserProfile();
        } catch (Exception e) {
        }
        event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
      }
    }
  }

  static public class DeleteMessageActionListener extends EventListener<UIListInBoxPrivateMessage> {
    public void execute(Event<UIListInBoxPrivateMessage> event) throws Exception {
      UIListInBoxPrivateMessage uicontainer = event.getSource();
      String objctId = event.getRequestContext().getRequestParameter(OBJECTID);
      if (!ForumUtils.isEmpty(objctId)) {
        uicontainer.forumService.removePrivateMessage(objctId, uicontainer.userName, Utils.RECEIVE_MESSAGE);
        UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
        forumPortlet.getUserProfile();
        event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
      }
    }
  }

  static public class ReplyMessageActionListener extends EventListener<UIListInBoxPrivateMessage> {
    public void execute(Event<UIListInBoxPrivateMessage> event) throws Exception {
      UIListInBoxPrivateMessage uicontainer = event.getSource();
      String objctId = event.getRequestContext().getRequestParameter(OBJECTID);
      ForumPrivateMessage privateMessage = uicontainer.getPrivateMessage(objctId);
      UIPrivateMessageForm privateMessageForm = uicontainer.getParent();
      privateMessageForm.setUpdate(privateMessage, true);
      event.getRequestContext().addUIComponentToUpdateByAjax(privateMessageForm);
    }
  }
}
