package OOXMLconvert;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.LinkedHashMap;

/**
 *
 * @author ferou
 */
public class CSSoutput {
	
	/** zoznam tried a k nim prislúchajúce štýly */
	private LinkedHashMap<String,String> classes = new LinkedHashMap<String, String>();

	/**
	 * Konštruktor
	 */
	public CSSoutput() {
		// noop
	}

	/**
	 * Funkcia pridá triedu do CSS zoznamu, ale zaručí neduplicitu.
	 * @param className meno triedy
	 * @param CSStext text CSS štýlov
	 */
	public void addClass(String className, String CSStext) {
		addClass("", className, "", CSStext);
	}

	/**
	 * Funkcia pridá triedu do CSS zoznamu, ale zaručí neduplicitu.
	 * @param className meno triedy
	 * @param CSStext text CSS štýlov
	 */
	public void addClass(String prefix, String className, String suffix, String CSStext) {
		try {
			if (!classes.containsKey(prefix + className + suffix)) {
				classes.put(prefix + className + suffix, CSStext);
			}
		}
		catch (Exception e) {
			System.err.println(this.getClass().getName() + " (addClass): " + e.toString());
		}
	}

	/**
	 * Funkcia hľadá, či už daný CSS štýl(y) nie je v zozname štýlov
	 * @param CSStextF text CSS štýlu
	 * @return null ak nenájde zodpovedajúci štýl, inak meno triedy, v ktorej je hľadaný CSS štýl
	 */
	private String findClass(String CSStextF) {
		try {
			Iterator i = classes.keySet().iterator();
			while (i.hasNext()) {
				String className = (String)i.next();
				String CSStext = classes.get(className);
				if (CSStextF.trim().equals(CSStext.trim())) {
					return className;
				}
			}
			return null;
		}
		catch (Exception e) {
			System.err.println(this.getClass().getName() + " (findClass): " + e.toString());
			return null;
		}
	}

	/**
	 * Funkcia pridá triedu s dopredu neznámym menom do CSS zoznamu. Zaručí neduplicitu kľúča aj obsahu.
	 * @param CSStext text CSS štýlov
	 * @return String názov vygenerovanej triedy
	 */
	public String addClassN(String classNamePrefix, String CSStext) {
		return addClassN("", classNamePrefix, "", CSStext);
	}
	
	/**
	 * Funkcia pridá triedu s dopredu neznámym menom do CSS zoznamu. Zaručí neduplicitu kľúča aj obsahu.
	 * @param prefix prefix pred názvom classy
	 * @param classNamePrefix prefix názvu classy
	 * @param suffix suffix za názvom classy
	 * @param CSStext text CSS štýlov
	 * @return String názov vygenerovanej triedy
	 */
	public String addClassN(String prefix, String classNamePrefix, String suffix, String CSStext) {
		try {
			String className = findClass(CSStext);
			if (className == null) {
				// ak sa nenasla, vytvor novu
				int i = 1;
				while (classes.containsKey(prefix + classNamePrefix + i + suffix)) {
					i++;
				}
				className = classNamePrefix + i + "";
				classes.put(prefix+className+suffix, CSStext);
			}
			// odstran prefixy:
			if (className.startsWith(".") || className.startsWith("#")) {
				className = className.substring(1);
			}
			else {
				int pb = className.lastIndexOf('.');
				if (pb > -1) {
					className = className.substring(pb+1);
				}
			}
			return className;
		}
		catch (Exception e) {
			System.err.println(this.getClass().getName() + " (addClassN): " + e.toString());
			return "";
		}
	}
	
	/**
	 * Funkcia zapíše CSS do určeného súboru
	 * @param outputCSS súbor, do ktorého sa má zapísať CSS
	 * @return <i>true</i> ak nenastane chyba, <i>false</i> inak
	 */
	public boolean writeCSStoFile(File outputCSS) {
		try {
			if (Global.ooxmlParams.cssConnectionType == 2 && Global.ooxmlParams.cssSource != null) {
				// ak je nastaveny typ prepojenia s CSS na 2, tak iba skopiruj zdrojovy CSS do cieloveho
				// vytvor potrebne adresare
				outputCSS.getParentFile().mkdirs();
				// skopiruj vstupny CSS subor
				Functions.copyFile(Global.ooxmlParams.cssSource, outputCSS);
			}
			else if (Global.ooxmlParams.cssConnectionType == 1 && Global.ooxmlParams.cssSource != null) {
				// ak je nastaveny typ prepojenia s CSS na 1, tak skopiruj zdrojovy CSS do cieloveho a appenduj tam obsah
				// vytvor potrebne adresare
				outputCSS.getParentFile().mkdirs();
				// skopiruj vstupny CSS subor
				Functions.copyFile(Global.ooxmlParams.cssSource, outputCSS);
				// append CSS do suboru
				Writer out = new BufferedWriter(new FileWriter(outputCSS, true));
				try {
					Iterator i = classes.keySet().iterator();
					while (i.hasNext()) {
						String className = (String)i.next();
						String CSStext = classes.get(className);
						out.write(className + " {" + CSStext + "}\n");
					}
				}
				finally {
					out.close();
				}
			}
			else {
				// vytvor potrebne adresare
				outputCSS.getParentFile().mkdirs();
				// zapis CSS do suboru
				Writer out = new BufferedWriter(new FileWriter(outputCSS));
				try {
					Iterator i = classes.keySet().iterator();
					while (i.hasNext()) {
						String className = (String)i.next();
						String CSStext = classes.get(className);
						out.write(className + " {" + CSStext + "}\n");
					}
				}
				finally {
					out.close();
				}
			}
			return true;
		}
		catch (Exception e) {
			System.err.println(this.getClass().getName() + " (writeCSStoFile): " + e.toString());
			return false;
		}
	}
	
}
