package starxpert.openoffice.bean;

import java.io.File;
import java.io.Serializable;
import java.util.Map;

import javax.faces.event.ActionEvent;

import net.sf.jooreports.openoffice.connection.OpenOfficeConnection;

import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.util.OpenOfficeURI;
import org.alfresco.util.PropertyCheck;
import org.alfresco.util.TempFileProvider;
import org.alfresco.web.ui.common.component.UIActionLink;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XStorable;
import com.sun.star.lang.XComponent;
import com.sun.star.uno.UnoRuntime;

public class MyOpenOfficeTransform implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2601787246953331597L;
	/* Serial Number */
	private static Log logger = LogFactory.getLog(MyOpenOfficeTransform.class);
			

	/* Services */
	OpenOfficeConnection connection;
	NodeService nodeService;
	MimetypeService mimetypeService;
	FileFolderService fileFolderService;
	ContentService contentService;

	private void doSomething(XComponent myDoc) {
    	
    	// Modifier le document Office
		

    }
	
	/**
	 * Action appelée depuis un document Word ou Writer 
	 * @param event
	 */
	public void setupDocument(ActionEvent event) {
		
		
		PropertyCheck.mandatory(this, "connection", connection);
		
		try {
			// Recuperer le noeud concerne par l'action
			UIActionLink link = (UIActionLink) event.getComponent();
			Map<String, String> params = link.getParameterMap();
			String ref = params.get("ref");
			NodeRef currentNodeRef = new NodeRef(ref);

			// Creer un fichier temporaire et mettre le contenu du noeud dedans
			ContentReader contentReader = getContentService().getReader(currentNodeRef,
				ContentModel.PROP_CONTENT);
			File tempOpenOfficeFile = TempFileProvider.createTempFile("OpenOfficeTest", ".odt");
			contentReader.getContent(tempOpenOfficeFile);

			// Recuperer l'URI du fichier
			OpenOfficeURI uriOOo = new OpenOfficeURI(tempOpenOfficeFile.getPath());

			// Test de la connection
			if (!connection.isConnected())
	        {
				connection.connect();
	        }

			// Definition des proprietes d'ouverture
			PropertyValue hidden = new PropertyValue();
			hidden.Name = "Hidden"; //
			hidden.Value = new Boolean(false);

			PropertyValue[] propLoad = new PropertyValue[] { hidden };

			// Chargement du fichier temporaire
			XComponentLoader xDesktop = connection.getDesktop();
			XComponent openOfficeDoc = xDesktop.loadComponentFromURL(uriOOo.toString(), "_blank", 0, propLoad);

			// Modifier le document
			doSomething(openOfficeDoc);

			// Sauvegarder le fichier
			XStorable xStorable = (XStorable) UnoRuntime.queryInterface(XStorable.class, openOfficeDoc);
			xStorable.store();

			// Mettre Ã  jour le contenu du noeud alfresco
			ContentWriter contentWriter = getContentService().getWriter(currentNodeRef,
				ContentModel.PROP_CONTENT, true);
			contentWriter.setMimetype(getMimetypeService().guessMimetype(this.fileFolderService.getFileInfo(currentNodeRef).getName()));
			contentWriter.putContent(tempOpenOfficeFile);

		} catch (Exception e) {
			logger.error("Modification du document impossible", e);
		}
		return;
	}
	
	
	

	// ----------------------------------------------------------------------------------------------- Getters - Setters

	/**
     * @param connection
     *            the connection that the converter uses
     */
    public void setConnection(OpenOfficeConnection connection)
    {
        this.connection = connection;
    }
	/**
	 * Get the node service
	 * @return the nodeService
	 */
	public NodeService getNodeService() {
		return nodeService;
	}
	/**
	 * Set the node service
	 * @param nodeService
	 */
	public void setNodeService(NodeService nodeService) {
		this.nodeService = nodeService;
	}
	/**
	 * Get the mimetype service
	 * 
	 * @return the mimetypeService
	 */
	public MimetypeService getMimetypeService() {
		return mimetypeService;
	}

	/**
	 * Set the mimetype service
	 * 
	 * @param mimetypeService
	 */
	public void setMimetypeService(MimetypeService mimetypeService) {
		this.mimetypeService = mimetypeService;
	}

	/**
	 * Get the file folder service
	 * 
	 * @return the fileFolderService
	 */
	public FileFolderService getFileFolderService() {
		return fileFolderService;
	}

	/**
	 * Set the file folder service
	 * 
	 * @param fileFolderService
	 */
	public void setFileFolderService(FileFolderService fileFolderService) {
		this.fileFolderService = fileFolderService;
	}
	/**
	 * Get the content service
	 * @return the contentService
	 */
	public ContentService getContentService() {
		return contentService;
	}
	/**
	 * Set the content service
	 * @param contentService
	 */
	public void setContentService(ContentService contentService) {
		this.contentService = contentService;
	}


}

