/*
 * 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.authoring.listener;

import java.util.Collection;
import java.util.Iterator;

import javax.jcr.Node;

import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.portal.webui.workspace.UIPortalApplication;
import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
import org.exoplatform.services.cms.CmsService;
import org.exoplatform.services.listener.Event;
import org.exoplatform.services.listener.Listener;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.organization.Membership;
import org.exoplatform.services.organization.MembershipHandler;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.UserHandler;
import org.exoplatform.services.wcm.extensions.publication.PublicationManager;
import org.exoplatform.services.wcm.extensions.publication.lifecycle.impl.LifecyclesConfig.Lifecycle;
import org.exoplatform.services.wcm.extensions.publication.lifecycle.impl.LifecyclesConfig.State;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;

/**
 * Created by The eXo Platform SAS
 * Author : Benjamin Paillereau
 *          benjamin.paillereau@exoplatform.com
 * May 31, 2010
 */
public class PostUpdateStateEventListener extends Listener<CmsService, Node> {

  private static final Log   LOG = ExoLogger.getLogger(PostUpdateStateEventListener.class.getName());

  /** The pservice. */
  private PublicationManager publicationManager;

  /**
   * Instantiates a new post edit content event listener.
   *
   * @param publicationManager the publication manager
   */
  public PostUpdateStateEventListener(PublicationManager publicationManager) {
    this.publicationManager = publicationManager;
  }

  /*
   * (non-Javadoc)
   * @see
   * org.exoplatform.services.listener.Listener#onEvent(org.exoplatform.services
   * .listener.Event)
   */
  public void onEvent(Event<CmsService, Node> event) throws Exception {
    Node node = event.getData();

    String userId;
    try {
      userId = Util.getPortalRequestContext().getRemoteUser();
    } catch (Exception e) {
      userId = node.getSession().getUserID();
    }

    String currentState = node.getProperty("publication:currentState").getString();
    if (!"enrolled".equals(currentState)) {
      String nodeLifecycle = node.getProperty("publication:lifecycle").getString();
      // if (log.isInfoEnabled())
      // log.info(userId+"::"+currentState+"::"+nodeLifecycle);
      if (LOG.isInfoEnabled())
        LOG.info("@@@ " + currentState + " @@@@@@@@@@@@@@@@@@@ " + node.getPath());

      Lifecycle lifecycle = publicationManager.getLifecycle(nodeLifecycle);
      Iterator<State> states = lifecycle.getStates().iterator();
      State prevState = null;
      while (states.hasNext()) {
        State state = states.next();
        if (state.getState().equals(currentState)) {
          sendMail(node, state, userId, false, false);
          if ("published".equals(state.getState()) && prevState != null) {
            sendMail(node, prevState, userId, false, true);
          }
          if (states.hasNext()) {
            State nextState = states.next();
            sendMail(node, nextState, userId, true, false);
            break;
          }
        }
        prevState = state;
      }

      try {
        UIPortalApplication portalApplication = Util.getUIPortalApplication();
        PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
        UIWorkingWorkspace uiWorkingWS = portalApplication.getChildById(UIPortalApplication.UI_WORKING_WS_ID);
        portalRequestContext.addUIComponentToUpdateByAjax(uiWorkingWS);
        portalRequestContext.ignoreAJAXUpdateOnPortlets(true);
      } catch (Exception e) {
        if (LOG.isWarnEnabled()) {
          LOG.warn(e.getMessage());
        }
      }

    }
  }

  private void sendMail(Node node,
                        State state,
                        String userId,
                        boolean isNextState,
                        boolean isPublished) throws Exception {
    if (state.getMembership().contains(":")) {
      String[] membership = state.getMembership().split(":");
      String membershipType = membership[0];
      String group = membership[1];
      OrganizationService orgService = WCMCoreUtils.getService(OrganizationService.class);
      UserHandler userh = orgService.getUserHandler();
      MembershipHandler msh = orgService.getMembershipHandler();

      ListAccess<User> userList = userh.findUsersByGroupId(group);
      User currentUser = null;
      try {
        currentUser = userh.findUserByName(userId);
      } catch (Exception e) {
        if (LOG.isWarnEnabled()) {
          LOG.warn(e.getMessage());
        }
      }
      String username = userId;
      if (currentUser != null)
        username = currentUser.getFirstName() + " " + currentUser.getLastName();
      for (User user : userList.load(0, userList.getSize())) {
        Collection<Membership> mss = msh.findMembershipsByUserAndGroup(user.getUserName(), group);
        for (Membership ms : mss) {
          if (membershipType.equals(ms.getMembershipType())) {
            String from = "\"" + username + "\" <exocontent@exoplatform.com>";
            String to = user.getEmail();
            String subject, body;
            String editUrl = "http://localhost:8080/ecmdemo/private/classic/siteExplorer/repository/collaboration"
                + node.getPath();
            if (isPublished) {
              subject = "[eXo Content] Published : (published) " + node.getName();
            } else {
              if (isNextState) {
                subject = "[eXo Content] Request : (" + state.getState() + ") " + node.getName();
              } else {
                subject = "[eXo Content] Updated : (" + state.getState() + ") " + node.getName();
              }
            }
            body = "[ <a href=\"" + editUrl + "\">" + editUrl + "</a> ]<br/>" + "updated by "
                + username;
            // mailService.sendMessage(from, to, subject, body);
            if (LOG.isInfoEnabled()) {
              LOG.info("\n################ SEND MAIL TO USER :: " + user.getUserName() + "\nfrom: "
                  + from + "\nto: " + to + "\nsubject: " + subject + "\nbody: " + body
                  + "\n######################################################");
            }

          }
        }
      }
    }

  }

}
