/*
 * 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.ArrayList;
import java.util.Collections;
import java.util.List;

import org.exoplatform.commons.utils.StringCommonUtils;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.common.webui.WebUIUtils;
import org.exoplatform.forum.service.JCRPageList;
import org.exoplatform.forum.service.Post;
import org.exoplatform.forum.service.Topic;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.webui.UIForumKeepStickPageIterator;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.forum.webui.UITopicDetail;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;

@ComponentConfig(
    lifecycle = UIFormLifecycle.class,
    template = "app:/templates/forum/webui/popup/UISplitTopicForm.gtmpl",
    events = {
      @EventConfig(listeners = UISplitTopicForm.SaveActionListener.class), 
      @EventConfig(listeners = UISplitTopicForm.CancelActionListener.class,phase = Phase.DECODE),
      @EventConfig(listeners = UIForumKeepStickPageIterator.GoPageActionListener.class)
    }
)
public class UISplitTopicForm extends UIForumKeepStickPageIterator implements UIPopupComponent {
  private Topic              topic                   = new Topic();

  private boolean            isRender                = true;

  private boolean            isSetPage               = true;

  public static final String FIELD_SPLITTHREAD_INPUT = "SplitThread";

  public UISplitTopicForm() throws Exception {
    addUIFormInput(new UIFormStringInput(FIELD_SPLITTHREAD_INPUT, FIELD_SPLITTHREAD_INPUT, null));
    this.setActions(new String[] { "Save", "Cancel" });
  }

  public void activate() {
  }

  public void deActivate() {
  }

  public boolean getIdRender() {
    return this.isRender;
  }

  @SuppressWarnings("unchecked")
  protected List<Post> getListPost() throws Exception {
    String path = this.topic.getPath();
    path = path.substring(path.indexOf(Utils.CATEGORY));
    if (isSetPage) {
      pageList = getForumService().getPostForSplitTopic(path);
    }
    pageList.setPageSize(6);
    maxPage = pageList.getAvailablePage();
    List<Post> posts = pageList.getPage(pageSelect);
    pageSelect = pageList.getCurrentPage();
    if (maxPage <= 1)
      isRender = false;
    String checkBoxId;
    for (Post post : posts) {
      checkBoxId = post.getCreatedDate().getTime() + ForumUtils.SLASH + post.getId();
      if (getUICheckBoxInput(checkBoxId) != null) {
        getUICheckBoxInput(checkBoxId).setChecked(false);
      } else {
        addUIFormInput(new UICheckBoxInput(checkBoxId, checkBoxId, false));
      }
    }
    isSetPage = true;
    return posts;
  }

  public void setPageListPost(JCRPageList pageList) {
    this.pageList = pageList;
    isSetPage = false;
  }

  protected Topic getTopic() {
    return this.topic;
  }

  public void setTopic(Topic topic) {
    this.topic = topic;
  }

  static public class SaveActionListener extends EventListener<UISplitTopicForm> {
    public void execute(Event<UISplitTopicForm> event) throws Exception {
      UISplitTopicForm uiForm = event.getSource();
      String newTopicTitle = uiForm.getUIStringInput(FIELD_SPLITTHREAD_INPUT).getValue();
      if (!ForumUtils.isEmpty(newTopicTitle)) {
        newTopicTitle = StringCommonUtils.encodeSpecialCharForSimpleInput(newTopicTitle);
        // postIds number/id
        List<String> postIds = uiForm.getIdSelected();
        if (postIds.size() > 0) {
          Collections.sort(postIds);
          List<String> postPaths = new ArrayList<String>();
          String path = uiForm.topic.getPath();
          for (String str : postIds) {
            postPaths.add(path + str.substring(str.indexOf(ForumUtils.SLASH)));
          }
          // Create new topic split
          Topic topic = new Topic();
          Post post = uiForm.getForumService().getPost(ForumUtils.EMPTY_STR, ForumUtils.EMPTY_STR, ForumUtils.EMPTY_STR, postPaths.get(0));
          String owner = uiForm.getUserProfile().getUserId();
          String topicId = post.getId().replaceFirst(Utils.POST, Utils.TOPIC);
          topic.setId(topicId);
          topic.setTopicName(newTopicTitle);
          topic.setOwner(post.getOwner());
          topic.setModifiedBy(owner);
          topic.setDescription(post.getMessage());
          topic.setIcon(post.getIcon());
          topic.setAttachments(post.getAttachments());
          topic.setIsWaiting(post.getIsWaiting());
          Post lastPost = uiForm.getForumService().getPost(ForumUtils.EMPTY_STR, ForumUtils.EMPTY_STR, ForumUtils.EMPTY_STR, postPaths.get(postPaths.size() - 1));
          topic.setLastPostBy(lastPost.getOwner());
          if (postPaths.size() > 1) {
            topic.setLastPostDate(lastPost.getCreatedDate());
          }
          // edit fist post for topic split
          post.setName(newTopicTitle);
          post.setIsApproved(true);
          post.setIsActiveByTopic(true);
          post.setIsHidden(false);
          post.setIsWaiting(false);
          
          try {
            // set link
            String link = ForumUtils.createdForumLink(ForumUtils.TOPIC, "pathId", false);
            
            String topicPath = Utils.getForumPath(path) + ForumUtils.SLASH + topicId;
            topic.setPath(topicPath);
            topic.setLink(ForumUtils.createdForumLink(ForumUtils.TOPIC, topic.getId(), false));
            uiForm.getForumService().splitTopic(topic, post, postPaths, WebUIUtils.getLabel(null, "UINotificationForm.label.EmailToAuthorMoved"), link);
          } catch (Exception e) {
            uiForm.log.error("Saving topic " + topic + " fail: " + e.getMessage(), e);
            uiForm.warning("UISplitTopicForm.msg.forum-deleted", false);
          }
          UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class);
          forumPortlet.cancelAction();
          UITopicDetail topicDetail = forumPortlet.findFirstComponentOfType(UITopicDetail.class);
          event.getRequestContext().addUIComponentToUpdateByAjax(topicDetail);
        } else {
          uiForm.warning("UITopicDetail.msg.notCheckPost");
        }
      } else {
        uiForm.getIdSelected();
        uiForm.warning("NameValidator.msg.ShortText", new String[] { uiForm.getLabel(FIELD_SPLITTHREAD_INPUT) });
      }
    }
  }

  static public class CancelActionListener extends EventListener<UISplitTopicForm> {
    public void execute(Event<UISplitTopicForm> event) throws Exception {
      UISplitTopicForm uiForm = event.getSource();
      UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class);
      forumPortlet.cancelAction();
    }
  }
}
