/*
 * Copyright (C) 2003-2007 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.ecm.webui.component.explorer.popup.actions;

import java.io.InputStream;

import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.exoplatform.ecm.webui.component.explorer.UIDocumentInfo;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.input.UIUploadInput;


/**
 * Created by The eXo Platform SARL
 * Author : pham tuan
 *          phamtuanchip@yahoo.de
 * September 7, 2006
 * 14:42:15 AM
 */

@ComponentConfig(
  lifecycle = UIFormLifecycle.class,
  type     = UIResourceForm.class,
  template =  "system:/groovy/webui/form/UIFormWithTitle.gtmpl",
  events = {
    @EventConfig(listeners = UIResourceForm.SaveActionListener.class),
    @EventConfig(listeners = UIResourceForm.BackActionListener.class)
  }
)

public class UIResourceForm extends UIForm {

  final static public String FIElD_NAME = "name" ;
  final static public String FIElD_TEXTTOMODIFY = "textToModify" ;
  final static public String FIElD_FILETOUPLOAD = "fileToUpload" ;

  private NodeLocation contentNode_ ;
  private boolean isText_;
  private Session session_ ;

  public UIResourceForm() throws Exception {
    setMultiPart(true) ;
    addUIFormInput(new UIFormStringInput(FIElD_NAME, FIElD_NAME, null)) ;
  }

  public void setContentNode(Node node, Session session) throws RepositoryException {
    session_ = session ;
    contentNode_ = NodeLocation.getNodeLocationByNode(node);
    isText_ = node.getProperty("jcr:mimeType").getString().startsWith("text");
    String name = node.getParent().getName() ;
    getUIStringInput(FIElD_NAME).setValue(name) ;
    if(isText_) {
      String contentText = node.getProperty("jcr:data").getString() ;
      addUIFormInput(new UIFormTextAreaInput(FIElD_TEXTTOMODIFY, FIElD_TEXTTOMODIFY, contentText)) ;
    }else {
      getUIStringInput(FIElD_NAME).setReadOnly(true);
      UIUploadInput uiInput = new UIUploadInput(FIElD_FILETOUPLOAD, FIElD_FILETOUPLOAD);
      addUIFormInput(uiInput) ;
    }
  }

  public boolean isText() throws RepositoryException {
    return isText_;
  }

  static  public class SaveActionListener extends EventListener<UIResourceForm> {
    public void execute(Event<UIResourceForm> event) throws Exception {
      UIResourceForm uiResourceForm = event.getSource() ;
      Node contentNode = NodeLocation.getNodeByLocation(uiResourceForm.contentNode_);
      Property prop = contentNode.getProperty("jcr:mimeType") ;
      UIJCRExplorer uiJCRExplorer = uiResourceForm.getAncestorOfType(UIJCRExplorer.class) ;
      if(prop.getString().startsWith("text")) {
        String text = uiResourceForm.getUIFormTextAreaInput(FIElD_TEXTTOMODIFY).getValue() ;
        contentNode.setProperty("jcr:data", text) ;
      }else {
        UIUploadInput  fileUpload =
          (UIUploadInput)uiResourceForm.getUIInput(FIElD_FILETOUPLOAD) ;
        InputStream content =  fileUpload.getUploadDataAsStream(fileUpload.getUploadIds()[0]);
        contentNode.setProperty("jcr:data", content) ;
      }
      if(uiResourceForm.session_ != null) uiResourceForm.session_.save() ;
      else uiJCRExplorer.getSession().save() ;
      uiResourceForm.setRenderSibling(UIDocumentInfo.class);
    }
  }

  static  public class BackActionListener extends EventListener<UIResourceForm> {
    public void execute(Event<UIResourceForm> event) throws Exception {
      UIResourceForm uiResourceForm = event.getSource() ;
      uiResourceForm.setRenderSibling(UIDocumentInfo.class) ;
    }
  }
}

