package OOXMLconvert;

import java.io.File;
import org.jdom.Element;

/**
 *
 * @author ferou
 */
public class OOXMLconvert {

	/**
	 * Konštruktor
	 */
	public OOXMLconvert() {
		Global.ooxmlParams = new OOXMLparams();
		Global.ooxmlPreserve = new OOXMLpreserve();
	}
	
	/**
	 * Vypíše informáciu o programe a o použití.
	 */
	private void printHelp() {
		String help = 
				"\n" +
				"OOXML convert verzia 1.0\n" +
				"Frantisek Smitala (c) 2009\n" +
				"vytvorene ako diplomova praca\n" +
				"\n" +
				"Nespravne vstupne parametre\n" +
				"\n" +
				"Parametre:\n" +
				"-i - input subor (DOCX subor na skonvertovanie)\n" +
				"-o - output subor (HTML subor do ktoreho sa ulozi vystup)\n" +
				"-co - relativna cesta k adresaru, kde sa ulozia CSS\n" +
				"-io - relativna cesta k adresaru, kde sa ulozia obrazky\n" +
				"-fl - uroven zachovania formatovania (od 0 do 2)\n" +
				"-pi - urcuje, ci sa maju prenasat obrazky (y/n)\n" +
				"-jq - kvalita jpeg kompresie pouzitej na obrazkoch (od 1 do 100)\n" +
				"-hh - urcuje, ci sa maju heuristikou rozoznavat nadpisy (y/n)\n" +
				"-hs1 - nazov stylu nadpisu urovne 1\n" +
				"-hs2 - nazov stylu nadpisu urovne 2\n" +
				"-hs3 - nazov stylu nadpisu urovne 3\n" +
				"-ht - HTML tag pre nadpis\n" +
				"-pf - urcuje, ci sa prenasaju footnotes (y/n)\n" +
				"-pe - urcuje, ci sa prenasaju endnotes (y/n)\n" +
				"-ct - typ prepojenia na CSS subor\n" +
				"-ci - input CSS subor\n" +
				"-cssb - určuje CSS štýl pre hruby font\n" +
				"-cssi - určuje CSS štýl pre kurzivu\n" +
				"-cssu - určuje CSS štýl pre podciarknutie\n" +
				"-csss - určuje CSS štýl pre preciarknutie\n" +
				"-cssui - určuje CSS štýl pre horny index\n" +
				"-cssli - určuje CSS štýl pre dolny index\n" +
				"\n";
		System.out.print(help);
	}
	
	/**
	 * Funkcia, ktorá postupne spúšťa všetky potrebné funkcie.
	 * @return <i>true</i> ak nenastala chyba, <i>false</i> inak
	 */
	private boolean convert() {
		try {			
			// najprv odzipuj subor do tmp priecinka
			if (!Functions.unZip(Global.ooxmlParams.docxSource, Global.ooxmlParams.tmpDir)) {
				System.err.println("Chyba počas rozbaľovania obsahu dokumentu!");
				return false;
			}
			
			// nastav prenasanie formatovania pre jednotlive elementy
			Global.ooxmlPreserve.setElementsFormatting();
			
			// nacitaj vztahy
			Global.ooxmlRels = new OOXMLrels();
			if (!Global.ooxmlRels.readRels()) {
				System.err.println("Chyba počas čítania vzťahov v dokumente!");
				return false;
			}
			
			// precitaj témy
			Global.ooxmlTheme = new OOXMLtheme();
			Global.ooxmlTheme.readThemes();
			
			// precitaj numbering
			Global.ooxmlNumberings = new OOXMLnumberings();
			Global.ooxmlNumberings.readAllNumberings();
			
			// precitaj styly
			Global.ooxmlStyles = new OOXMLstyles();
			Global.ooxmlStyles.readStyles();

			// inicializuj CSS
			Global.cssOutput = new CSSoutput();

			// precitaj notes
			Global.ooxmlNotes = new OOXMLnotes();
			Global.ooxmlNotes.readNotes();
			
			// precitaj komentare - override parametrov
			Global.ooxmlComments = new OOXMLcomments();
			Global.ooxmlComments.readComments();
			
			// parse hlavny dokument
			OOXMLparser parser = new OOXMLparser();
			Element bodyEl = parser.parse(Global.ooxmlRels.mainDoc);
			if (bodyEl == null) {
				return false;
			}

			// vystup do XHTML suboru
			XHTMLoutput xhtmlOutput = new XHTMLoutput();
			if (!xhtmlOutput.writeXHTML(bodyEl)) {
				return false;
			}
			
			if (Global.ooxmlParams.formatPreservingLevel > 0) {
				// vystup do CSS suboru
				String cssPath = Functions.addEndSlash(Global.ooxmlParams.xhtmlDest.getParent()) + Global.ooxmlParams.cssDir;
				File cssFile = new File(cssPath);
				Global.cssOutput.writeCSStoFile(cssFile);
			}
			
			// zmaz docasny priecinok
			Functions.deleteDir(Global.ooxmlParams.tmpDir);
			return true;
		}
		catch (Exception e) {
			System.err.println(this.getClass().getName() + ": " + e.toString());
			return false;
		}
	}

	/**
	 * Hlavná funkcia, ktorá pripraví a spustí konverziu.
	 * @param params argumenty zo vstupu
	 */
	public void start(String[] params) {
		try {
			if ((params.length <= 0) || (!Global.ooxmlParams.setParams(params))) {
				// ak nie su ziadne vstupne parametre alebo su zle, tak len vypis help
				printHelp();
			}
			else {
				// spusti konverziu
				if (convert()) {
					// konverzia prebehla uspesne
					System.out.println("Konverzia prebehla uspesne.");
				}
				else {
					// nastala chyba
					System.out.println("Konverzia nebola uspesna.");				
				}
			}
		}
		catch (Exception e) {
			System.err.println(this.getClass().getName() + ": " + e.toString());
		}
	}

}
