package ag.ion.bion.officelayer;

import ag.ion.bion.officelayer.application.IOfficeApplication;
import ag.ion.bion.officelayer.application.OfficeApplicationRuntime;

import ag.ion.bion.officelayer.document.DocumentDescriptor;
import ag.ion.bion.officelayer.document.IDocument;

import ag.ion.bion.officelayer.filter.HTMLFilter;
import ag.ion.bion.officelayer.filter.IFilter;
import ag.ion.bion.officelayer.filter.TextFilter;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;


public class ClsMain {
  
  private static String officeHome = "/";
  private static String pathFile = "/";
  private static String logFile = "/log.txt";
  private static String outPath = "/";

  public static String runLocal() {
    ClsMain.pathFile = "\\singles\\tomcat\\webapps\\wy\\Testdateien\\Pfade.txt";
    ClsMain.officeHome = "c:/bla/blubb";
    return "local done";
  }

  public static String run(String offHo, String DatAblage, String path) throws IOException {
    String returnString = "";
    String officeHome = offHo;
    String Pfade = path;

    FileReader fr = new FileReader(Pfade);
    BufferedReader br = new BufferedReader(fr);
    String record = null;
    try {
      HashMap hashMap = new HashMap(3);    
      hashMap.put(IOfficeApplication.APPLICATION_TYPE_KEY, IOfficeApplication.LOCAL_APPLICATION);
      hashMap.put(IOfficeApplication.APPLICATION_HOME_KEY, officeHome);
      IOfficeApplication officeApplication = OfficeApplicationRuntime.getApplication(hashMap);
      officeApplication.activate();
      
      while ( (record=br.readLine()) != null ) { 
        
        //Dateinamen ermitteln
        String dEndung = "";
        String dName = "";
        char[] chars = new char[ 3 ];
        record.getChars(record.length()-3, record.length(), chars, 0);
        dEndung = new String(chars);
        int indBSlash = record.lastIndexOf("\\");
        int indDot = record.lastIndexOf(".");
        //Berechne die Laege des Dateinamens
        int rechne = indDot - (indBSlash+1);
        char[] filename = new char [rechne];
        record.getChars(indBSlash+1, indDot, filename, 0);
        dName = new String(filename);
        //dName ist Dateiname; dEndung die dazugehoerige Endung
        returnString = returnString + dName + "." + dEndung + "\n";       
    
        //Pfad zum Abspeichern; hier: das Tomcat-Webverzeichnis
        String saveHtml = DatAblage + dName + "_conv.html";
        String saveTxt = DatAblage + dName + "_conv.txt";
        //handelt es sich um ein TextDocument, dann im Writer oeffnen
        if (dEndung.compareTo("txt") == 0 || dEndung.compareTo("doc") == 0 || dEndung.compareTo("odt") == 0) {
          returnString = returnString + "Writer conversion to" + saveTxt + "\n";
          returnString = returnString + wrap(officeApplication, record, saveTxt, TextFilter.FILTER );
        }
        
        //handelt es sich um ein Sheet, dann im Calc oeffnen, ACHTUNG: csv-Format noch nicht getestet!
        if (dEndung.compareTo("xls") == 0 || dEndung.compareTo("ods") == 0 || dEndung.compareTo("csv") == 0) {
          returnString = returnString + "Calc conversion to" + saveTxt + "\n";
          wrap(officeApplication, record, saveTxt, TextFilter.FILTER);
        }
        
        // handelt es sich um eine Praesi, dann im Impress oeffnen
        if (dEndung.compareTo("ppt") == 0 || dEndung.compareTo("odp") == 0) {
          returnString = returnString + "Impress conversion to" + saveHtml + "\n";
          wrap(officeApplication, record, saveHtml, HTMLFilter.FILTER);
        }
      }
      officeApplication.deactivate();
    } catch (Throwable e) {
      returnString = returnString + e.getMessage();
    }    
    return returnString;
  }
  
  public static String wrap(IOfficeApplication officeApplication, String indexLis, String export, IFilter ifil) {
    String returnString = "";     
    try {      
      IDocument doc = officeApplication.getDocumentService().loadDocument(indexLis, DocumentDescriptor.DEFAULT_HIDDEN);
      doc.getPersistenceService().export(export, ifil);
      doc.close();
    }
    catch (Throwable ta) {
      returnString = returnString + ta.getMessage();
      ta.printStackTrace();
    }
    
    return returnString;
  }
}

