/*
 * Copyright (C) 2003-2009 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.fastcontentcreator.config.action;

import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.cms.actions.ActionServiceContainer;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.wcm.webui.fastcontentcreator.UIFCCPortlet;
import org.exoplatform.wcm.webui.fastcontentcreator.UIFCCUtils;
import org.exoplatform.wcm.webui.fastcontentcreator.config.UIFCCConfig;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormSelectBox;

import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NodeType;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by The eXo Platform SAS
 * Author : eXoPlatform
 * chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com
 * Jun 25, 2009
 */
@ComponentConfig(
    lifecycle = UIFormLifecycle.class,
    template = "system:/groovy/FastContentCreatorPortlet/UIFCCActionTypeForm.gtmpl",
    events = {
      @EventConfig(listeners = UIFCCActionTypeForm.ChangeActionTypeActionListener.class)
    }
)
public class UIFCCActionTypeForm extends UIForm {

  /** The Constant ACTION_TYPE. */
  final static public String ACTION_TYPE = "actionType" ;

  /** The Constant CHANGE_ACTION. */
  final static public String CHANGE_ACTION = "ChangeActionType" ;

  /** The type list_. */
  private List<SelectItemOption<String>> typeList_ ;

  /** The node path. */
  private String nodePath = null;

  /** The default action type_. */
  public String defaultActionType_ ;

  /**
   * Instantiates a new uIFCC action type form.
   *
   * @throws Exception the exception
   */
  public UIFCCActionTypeForm() throws Exception {
    typeList_ = new ArrayList<SelectItemOption<String>>() ;
    UIFormSelectBox uiSelectBox = new UIFormSelectBox(ACTION_TYPE,
                                                      ACTION_TYPE,
                                                      new ArrayList<SelectItemOption<String>>());
    uiSelectBox.setOnChange(CHANGE_ACTION) ;
    addUIFormInput(uiSelectBox) ;
  }

  /**
   * Gets the created action types.
   *
   * @return the created action types
   *
   * @throws Exception the exception
   */
  private Iterator<NodeType> getCreatedActionTypes() throws Exception {
    ActionServiceContainer actionService = getApplicationComponent(ActionServiceContainer.class) ;
    return actionService.getCreatedActionTypes(UIFCCUtils.getPreferenceRepository()).iterator();
  }

  /**
   * Sets the default action type.
   *
   * @throws Exception the exception
   */
  public void setDefaultActionType() throws Exception{
    boolean isNews = true;
    UIFCCPortlet fastContentCreatorPortlet = getAncestorOfType(UIFCCPortlet.class);
    UIFCCConfig fastContentCreatorConfig = fastContentCreatorPortlet.getChild(UIFCCConfig.class);
    Node savedLocationNode = fastContentCreatorConfig.getSavedLocationNode() ;
    UIFCCActionContainer fastContentCreatorActionContainer = getParent() ;
    UIFCCActionForm fastContentCreatorActionForm = fastContentCreatorActionContainer.getChild(UIFCCActionForm.class);
    if(defaultActionType_ == null) {
      defaultActionType_ = "exo:addMetadataAction";
      isNews = true;
    }else{
      isNews = false;
    }
    fastContentCreatorActionForm.setNodePath(nodePath) ;
    getUIFormSelectBox(ACTION_TYPE).setValue(defaultActionType_).setDisabled(!isNews);

    fastContentCreatorActionForm.createNewAction(savedLocationNode, defaultActionType_, isNews);
    fastContentCreatorActionForm.setWorkspace(savedLocationNode.getSession()
                                                               .getWorkspace()
                                                               .getName());
    fastContentCreatorActionForm.setStoredPath(savedLocationNode.getPath());
  }

  /**
   * Update.
   *
   * @throws Exception the exception
   */
  public void update() throws Exception {
    Iterator<NodeType> actions = getCreatedActionTypes();
    while(actions.hasNext()){
      String action =  actions.next().getName();
      typeList_.add(new SelectItemOption<String>(action, action));
    }
    getUIFormSelectBox(ACTION_TYPE).setOptions(typeList_) ;
    setDefaultActionType() ;
  }

  /**
   * Inits the.
   *
   * @param nodePath the node path
   * @param actionType the action type
   *
   * @throws RepositoryException the repository exception
   */
  public void init(String nodePath, String actionType) throws RepositoryException {
    this.nodePath = nodePath;
    this.defaultActionType_ = actionType;
  }

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

    /* (non-Javadoc)
     * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
     */
    public void execute(Event<UIFCCActionTypeForm> event) throws Exception {
      UIFCCActionTypeForm fastContentCreatorActionTypeForm = event.getSource() ;
      UIFCCPortlet fastContentCreatorPortlet = fastContentCreatorActionTypeForm.getAncestorOfType(UIFCCPortlet.class);
      UIFCCConfig fastContentCreatorConfig = fastContentCreatorPortlet.getChild(UIFCCConfig.class);
      Node currentNode = fastContentCreatorConfig.getSavedLocationNode() ;
      String actionType = fastContentCreatorActionTypeForm.getUIFormSelectBox(ACTION_TYPE).getValue() ;
      TemplateService templateService = fastContentCreatorActionTypeForm.getApplicationComponent(TemplateService.class) ;
      String userName = Util.getPortalRequestContext().getRemoteUser() ;
      UIApplication uiApp = fastContentCreatorActionTypeForm.getAncestorOfType(UIApplication.class) ;
      try {
        String templatePath = templateService.getTemplatePathByUser(true, actionType, userName) ;
        if (templatePath == null) {
          Object[] arg = { actionType };
          uiApp.addMessage(new ApplicationMessage("UIFastContentCreatorActionTypeForm.msg.access-denied",
                                                  arg,
                                                  ApplicationMessage.WARNING));
          
          actionType = "exo:addMetadataAction" ;
          fastContentCreatorActionTypeForm.getUIFormSelectBox(UIFCCActionTypeForm.ACTION_TYPE).setValue(actionType) ;
          UIFCCActionContainer fastContentCreatorActionContainer = fastContentCreatorActionTypeForm.
              getAncestorOfType(UIFCCActionContainer.class);
          UIFCCActionForm fastContentCreatorActionForm = fastContentCreatorActionContainer.getChild(UIFCCActionForm.class);
          fastContentCreatorActionForm.createNewAction(currentNode, actionType, true);
          event.getRequestContext().addUIComponentToUpdateByAjax(fastContentCreatorActionContainer);
          return ;
        }
      } catch (PathNotFoundException path) {
        Object[] arg = { actionType } ;
        uiApp.addMessage(new ApplicationMessage("UIFastContentCreatorActionTypeForm.msg.not-support",
                                                arg,
                                                ApplicationMessage.WARNING));
        
        actionType = "exo:addMetadataAction" ;
        fastContentCreatorActionTypeForm.getUIFormSelectBox(UIFCCActionTypeForm.ACTION_TYPE).setValue(actionType) ;
        UIFCCActionContainer fastContentCreatorActionContainer = fastContentCreatorActionTypeForm.
            getAncestorOfType(UIFCCActionContainer.class);
        UIFCCActionForm fastContentCreatorActionForm = fastContentCreatorActionContainer.getChild(UIFCCActionForm.class);
        fastContentCreatorActionForm.createNewAction(currentNode, actionType, true);
        event.getRequestContext().addUIComponentToUpdateByAjax(fastContentCreatorActionContainer);
      }
      UIFCCActionContainer fastContentCreatorActionContainer = fastContentCreatorActionTypeForm.getParent();
      UIFCCActionForm uiActionForm = fastContentCreatorActionContainer.getChild(UIFCCActionForm.class);
      uiActionForm.createNewAction(currentNode, actionType, true);
      event.getRequestContext().addUIComponentToUpdateByAjax(fastContentCreatorActionContainer);
    }
  }
}
