/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

package org.libreoffice.example.java_scripts;

//import com.sun.star.frame.XComponentLoader;
import java.io.*;
import com.sun.star.lang.XComponent;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.frame.XStorable;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.frame.XModel;
import com.sun.star.script.framework.runtime.XScriptContext;

// for debug only
import javax.swing.JOptionPane;

public class OfficeAttachment
{

    private StatusWindow status = null;
    private XStorable storedDoc = null;
    private File htmlFile = null;
    private File officeFile = null;
    private boolean isHtmlDoc = false;
    private boolean isOfficeDoc = false;
    private String templocationURL = "";
    private String templocationSystem = "";
    private String attachmentName = "";
    private String statusLine = "";

    public OfficeAttachment( XScriptContext xsc, StatusWindow sw, boolean html, boolean office )
    {
        status = sw;
        isHtmlDoc = html;
        isOfficeDoc = office;

        templocationSystem = templocationURL = System.getProperty( "user.home" );
        if( System.getProperty( "os.name" ).indexOf( "Windows" ) != -1 )
        {
            while( templocationURL.indexOf( "\\" ) != -1 )
            {
                int sepPos = templocationURL.indexOf( "\\" );
                String firstPart = templocationURL.substring( 0, sepPos );
                String lastPart = templocationURL.substring( sepPos + 1, templocationURL.length() );
                templocationURL = firstPart + "/" + lastPart;
                //JOptionPane.showMessageDialog( null, "Temp Location URL is: " + templocationURL + "\nfirstPart is: " + firstPart + "\nlastPart is: " + lastPart );
            }
        }

        try
        {
            statusLine = "Querying Office for current document";
            status.setStatus( 1, statusLine );
            XScriptContext scriptcontext = xsc;
            XModel xmodel = scriptcontext.getDocument();
            storedDoc = (XStorable) UnoRuntime.queryInterface(XStorable.class, xmodel);
            // find document name from storedDoc
            attachmentName = storedDoc.getLocation();
        }
        catch( Exception e )
        {
            //UNO error
            status.setStatus( 1, "Error: " + statusLine );
        }

        if( attachmentName.equalsIgnoreCase( "" ) )
        {
            attachmentName = "Attachment";
        }
        else
        {
            //int lastSep = attachmentName.lastIndexOf( System.getProperty( "file.separator" ) );
            int lastSep = attachmentName.lastIndexOf( "/" );
            attachmentName = attachmentName.substring( lastSep + 1, attachmentName.length() );
            int dot = attachmentName.indexOf( "." );
            attachmentName = attachmentName.substring( 0, dot );
        }
    }


    public boolean createTempDocs()
    {
        String filenameURL = "file:///" + templocationURL +  "/" + attachmentName;
        //String filenameSystem = templocationSystem + System.getProperty( "file.separator" ) + attachmentName;
        //JOptionPane.showMessageDialog( null, "Filename URL " + filenameURL );
        try
        {
            if( isHtmlDoc )
            {
                //JOptionPane.showMessageDialog( null, "Saving doc in HTML format" );
                statusLine = "Saving doc in HTML format";
                status.setStatus( 4, statusLine );
                //System.out.print( "Saving attachment as " + filename + ".html..." );
                       PropertyValue[] propertyvalue_html = new PropertyValue[2];
                    propertyvalue_html[0] = new PropertyValue();
                        propertyvalue_html[0].Name = new String("Overwrite");
                    propertyvalue_html[0].Value = new Boolean(true);
                       propertyvalue_html[1] = new PropertyValue();
                    propertyvalue_html[1].Name = ("FilterName");
//                  propertyvalue_html[1].Value = new String("scalc: HTML (StarCalc)");
                    propertyvalue_html[1].Value = new String("swriter: HTML (StarWriter)");
                storedDoc.storeAsURL( filenameURL + ".html", propertyvalue_html);

                File homedir = new File( templocationSystem );
                //JOptionPane.showMessageDialog( null, "homedir (Java File): " + homedir.getPath() );
                File homefiles[] = homedir.listFiles();
                String file = "";
                for(int i=0; i < homefiles.length; i++ )
                {
                    if( homefiles[i].getName().equals( attachmentName + ".html" ) )
                    {
                        //htmlFile = new File( homefiles[i].getAbsolutePath() );
                        //JOptionPane.showMessageDialog( null, "Found HTML" );
                        file = homefiles[i].getAbsolutePath();
                    }
                }
                htmlFile = new File( file );
                //htmlFile = new File( filename + ".html" );
                //htmlFile = new File( storedDoc.getLocation() );
            }

            if( isOfficeDoc )
            {
                //JOptionPane.showMessageDialog( null, "Saving doc in .sxw format" );
                statusLine = "Saving doc in .sxw format";
                status.setStatus( 4, statusLine );
                //System.out.print( "Saving attachment as " + filename + ".sxw..." );
                PropertyValue[] propertyvalue_sxw = new PropertyValue[2];
                    propertyvalue_sxw[0] = new PropertyValue();
                    propertyvalue_sxw[0].Name = new String("Overwrite");
                    propertyvalue_sxw[0].Value = new Boolean(true);
                    propertyvalue_sxw[1] = new PropertyValue();
                    propertyvalue_sxw[1].Name = new String("Overwrite");
                    propertyvalue_sxw[1].Value = new Boolean(true);
                    storedDoc.storeAsURL( filenameURL + ".sxw", propertyvalue_sxw);

                File homedir = new File( templocationSystem );

                //JOptionPane.showMessageDialog( null, "homedir (Java File): " + homedir.getPath() );

                                File homefiles[] = homedir.listFiles();
                String file = "";
                                for(int i=0; i < homefiles.length; i++ )
                                {
                                        if( homefiles[i].getName().equals( attachmentName + ".sxw" ) )
                                        {
                                                //officeFile = new File( homefiles[i].getAbsolutePath() );
                        //JOptionPane.showMessageDialog( null, "Found .sxw" );
                        file = homefiles[i].getAbsolutePath();
                                        }
                                }
                officeFile = new File( file );
                //officeFile = new File( filename + ".sxw" );
                //officeFile = new File (storedDoc.getLocation() );
            }

            //status.setStatus( 10, "Attachments successfully created" );

        }
        catch( SecurityException se )
        {
            status.setStatus( 4, "Error: " + statusLine );
            System.out.println( "Security error while saving temporary Document(s). Check file permissions in home directory." );
            se.printStackTrace();
            htmlFile = null;
            officeFile = null;
            return false;
        }
        catch( Exception e )
        {
            status.setStatus( 4, "Error: " + statusLine );
            System.out.println( "Error saving temporary Document(s)" );
            e.printStackTrace();
            htmlFile = null;
            officeFile = null;
            return false;
        }
        return true;
    }


    public boolean removeTempDocs()
    {
        /*
        if( !htmlFile.exists() && !officeFile.exists() )
                {
            System.out.println("Error: Document(s) have not been saved." );
        }
        */

        statusLine = "Removing temp docs";
        status.setStatus( 13, statusLine );

        try
        {
            if( isOfficeDoc && isHtmlDoc )
            {
                //System.out.println( "Removing: " + htmlFile.getPath() + " " + officeFile.getPath() );
                //System.out.println( "htmlfile " + htmlFile.exists() + " officeFile " + officeFile.exists() );
                //JOptionPane.showMessageDialog( null, "Removing: " + htmlFile.getPath() + " " + officeFile.getPath() );
                //JOptionPane.showMessageDialog( null, "htmlfile " + htmlFile.exists() + " officeFile " + officeFile.exists() );
                htmlFile.delete();
                officeFile.delete();
                //JOptionPane.showMessageDialog( null, "htmlfile " + htmlFile.exists() + " officeFile " + officeFile.exists() );
            }
            else
            {
                if( isOfficeDoc )
                               {
                    //System.out.println( "Removing: " + officeFile.getPath() );
                    officeFile.delete();
                }
                else
                {
                    //System.out.println( "Removing: " + htmlFile.getPath() );
                    htmlFile.delete();
                }
            }
        }
        catch( SecurityException se )
        {
            status.setStatus( 13, "Error: " + statusLine );
            System.out.println( "Security Error while deleting temporary Document(s). Check file permissions in home directory." );
            se.printStackTrace();
            return false;
        }
        return true;
    }


    public void cleanUpOnError()
    {
        try
        {
            if( isOfficeDoc && isHtmlDoc )
            {
                htmlFile.delete();
                officeFile.delete();
            }
            else
            {
                if( isOfficeDoc )
                               {
                    officeFile.delete();
                }
                else
                {
                    htmlFile.delete();
                }
            }
        }
        catch( SecurityException se )
        {
            System.out.println( "Security Error while deleting temporary Document(s). Check file permissions in home directory." );
            se.printStackTrace();
        }
    }


    public File[] getAttachments()
    {
        /*
        if( htmlFile == null && officeFile == null )
        {
            System.out.println( "Error: Document(s) have not been saved." );
            return null;
        }
        */
        //(officeDoc) ? (number = 2) : (number = 1);

        statusLine = "Retrieving temp docs";
        status.setStatus( 8, statusLine );

        File attachments[] = null;
        if( isOfficeDoc && isHtmlDoc )
        {
            attachments = new File[2];
            attachments[0] = htmlFile;
            attachments[1] = officeFile;
        }
        else
        {
            if( isOfficeDoc )
            {
                attachments = new File[1];
                attachments[0] = officeFile;
            }
            else
            {
                attachments = new File[1];
                attachments[0] = htmlFile;
            }
        }

        return attachments;
    }


    public boolean isHtmlAttachment()
    {
        return isHtmlDoc;
    }


    public boolean isOfficeAttachment()
    {
        return isOfficeDoc;
    }

}
