package de.superx.bin;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import de.memtext.util.DateUtils;
import de.memtext.util.GetOpts;
import de.memtext.util.GetOpts.Options;
import de.memtext.util.LogUtils;
import de.memtext.util.StringUtils;
import de.memtext.util.XMLUtils;
/**
 * @deprecated
 * @author superx
 *
 */
@Deprecated
public class WebserviceClientBewegungsdatenAlt extends AbstractWebserviceClient {
	private Document resultDocument, configDocument;
	private String hsnr;
	private final Calendar calendar = Calendar.getInstance();
	private String xmlConfig, datentyp;
	private String url;
	private String data;
	private String soap, replaceNodeName;
	private String xslpfad, outfile;
	
	private File tempFile;
	private String jahr;
	private PrintWriter fw;
	private BufferedWriter bfw;
	private static final Logger log = Logger.getLogger("wc");
	public static void main(String args[]) {
		System.out
				.println("SuperX-WebserviceClientBewegungsdaten Version 0.9.3");
		WebserviceClientBewegungsdatenAlt tc = new WebserviceClientBewegungsdatenAlt();
		tc.run(args);
	}
	public WebserviceClientBewegungsdatenAlt() {
	}
	public void run(String args[]) {
		try {
			// LogUtils.initRaw(log);
			LogUtils.initRawFileDateTime("wc", "WebserviceClient.log", 100000,
					1, true, false);
			log.setLevel(Level.FINEST);
			log.getHandlers()[0].setLevel(Level.FINEST);
			GetOpts.setOpts(args);
			String isdrin = GetOpts.isAllRequiredOptionsPresent(new Options[] {Options.opt_xmlconfig,
			                                                                   Options.opt_xslPfad,
			                                                                   Options.opt_hsnr,
			                                                                   Options.opt_jahr,
			                                                                   Options.opt_out,
			                                                                   Options.opt_datentyp});
			if (isdrin != null) {
				System.err.println("Folgende Optionen fehlen: " + isdrin);
				// System.err.println(usage);
				System.exit(1);
			}
			readConfig();
			perform();
			String msg = "    fertig: " + DateUtils.getTodayString() + " "
					+ DateUtils.getNowString();
			log.info(msg);
			System.out.println(msg);
		} catch (Exception e) {
			log.severe(e.getMessage());
			System.out.println("Error " + e.getMessage());
			e.printStackTrace();
			System.exit(1);
		} finally {
			LogUtils.close("wc");
		}
	}
	private void perform() throws Exception {
		Node n = XMLUtils.getFirstNode(configDocument, datentyp + "detailurl");
		url = XMLUtils.getTheValue(n);
		url = adaptURL(url);
		n = XMLUtils.getFirstNode(configDocument, datentyp + "detailsoap");
		soap = XMLUtils.getTheValue(n);
		soap = soap.replace("XXHSNRXX", hsnr);
		soap = soap.replace("XXJAHRXX", jahr);
		System.out.println(datentyp + "\n14x " + soap);
		n = XMLUtils.getFirstNode(configDocument, datentyp
				+ "detailreplacenode");
		replaceNodeName = XMLUtils.getAttribValue(n, "from");
		initTempFile();
		// monat 0 ist Vorjahr, Monat 13 ist Folgejahr
		for (int monat = 0; monat <= 4; monat++) {
			String monatssoap = getMonatsoap(monat);
			log.fine(datentyp + "\nSOAP Aufruf:\n" + monatssoap);
			System.out.print("starte Aufruf " + (monat + 1));
			data = readSOAP(monatssoap, url).toString();
			System.gc();
			System.out.println("  -  empfangen ");
			
			data = data
					.replaceAll("<\\?xml.*\\?>", "");
			System.gc();
			data = XMLUtils.removeTroublesomeCharacters(data);
			System.gc();
			data = data.replaceAll("\u20AC", "EUR");
			System.gc();
			data = data.replaceAll("\u2013", "-");// dash
			System.gc();
			data = data.replaceAll("\u2026", "...");// ...
			System.gc();
			data = StringUtils.replace(data, replaceNodeName, "response");
			System.gc();
			resultDocument = XMLUtils.buildDocumentFromString(data, false);
			if (isReplyOk()) {
				if (data.indexOf("")>-1||
						data.indexOf("")>-1||
						data.indexOf("")>-1) continue;
				else
				appendData();
			} else {
				String msg = "Error: Aufruf von Webservice für Bewegungsdaten "
						+ datentyp + " (" + xmlConfig + ") fehlgeschlagen";
				System.out.println(msg);
				log.severe(msg);
				LogUtils.close("wc");
				System.exit(-1);
			}
			System.gc();
		}
		closeFileAndTransform();
	}
	private String getMonatsoap(int monat) {
		String tempsoap = soap;
		if (monat == 0) {
			int vorjahr = Integer.parseInt(jahr);
			vorjahr--;
			tempsoap = tempsoap.replaceAll("XXSTARTXX", vorjahr + "-01-01");
			tempsoap = tempsoap.replaceAll("XXENDEXX", vorjahr + "-12-31");
		}
		if (monat >= 1 && monat <= 12) {
			int jahrint = Integer.parseInt(jahr);
			calendar.set(Calendar.YEAR, jahrint);
			calendar.set(Calendar.MONTH, monat - 1);
			String monatstr;
			if (monat < 10)
				monatstr = "0" + monat;
			else
				monatstr = monat + "";
			tempsoap = tempsoap.replaceAll("XXSTARTXX", jahr + "-" + monatstr
					+ "-01");
			int maxDay = calendar.getActualMaximum(Calendar.DATE);
			tempsoap = tempsoap.replaceAll("XXENDEXX", jahr + "-" + monatstr
					+ "-" + maxDay);
		}
		if (monat == 13) {
			int folgejahr = Integer.parseInt(jahr);
			folgejahr++;
			tempsoap = tempsoap.replaceAll("XXSTARTXX", folgejahr + "-01-01");
			tempsoap = tempsoap.replaceAll("XXENDEXX", folgejahr + "-12-31");
		}
		return tempsoap;
	}
	private void readConfig() throws IOException, SAXException {
		xmlConfig = GetOpts.getValue(Options.opt_xmlconfig);
		outfile = GetOpts.getValue(Options.opt_out);
		xslpfad = GetOpts.getValue(Options.opt_xslPfad);
		hsnr = GetOpts.getValue(Options.opt_hsnr);
		jahr = GetOpts.getValue(Options.opt_jahr);
		datentyp = GetOpts.getValue(Options.opt_datentyp);
		System.out.println("\n" + DateUtils.getTodayString() + " "
				+ DateUtils.getNowString() + "\nHochschulnummer " + hsnr);
		log.info("\nHochschulnummer " + hsnr);
		if (GetOpts.isPresent(Options.opt_noDelete))
			isDeleteTmpXmlFileWanted = false;
		log.log(Level.INFO, "Geschaeftsjahr " + jahr);
		System.out.println("Geschaeftsjahr " + jahr);
		log.log(Level.INFO, "Verarbeite " + xmlConfig);
		System.out.println("Verarbeite " + xmlConfig);
		configDocument = XMLUtils.buildDocument(new File(xmlConfig));
	}
	private void appendData() throws Exception {
		bfw.write(data);
		bfw.flush();
	}
	private void initTempFile() throws Exception {
		tempFile = File.createTempFile("webservicedata", ".xml");
		// File f=new File("tmpwebservice.xml");
		if (!isDeleteTmpXmlFileWanted) {
			System.out.println("Temp Datei: " + tempFile.getAbsolutePath());
			log.info("Temp Datei: " + tempFile.getAbsolutePath());
		}
		if (tempFile.exists())
			tempFile.delete();
		// FileWriter fw = new FileWriter(f);
		fw = new PrintWriter(tempFile, "UTF-8");
		// FileOutputStream fos = new FileOutputStream(f, false);
		// BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(fos));
		bfw = new BufferedWriter(fw);
		bfw.write("\n");
	}
	private void closeFileAndTransform() throws Exception {
		bfw.write("\n\n");
		bfw.close();
		fw.close();
		SxTransformer sxTrans = new SxTransformer(log, outfile);
		sxTrans.quellstring = tempFile.getAbsolutePath();
		sxTrans.stylesheet = xslpfad + File.separator + "soap_to_csv_"
				+ datentyp + ".xsl";
		sxTrans.params = "ignoreElements=EX_JEST";
		sxTrans.transformFile("text");
		//bei Fmiit auch HeaderDatei erzeugen
		if (datentyp.equals("fmifiit"))
		{
			
		sxTrans.outfile=StringUtils.replace(outfile, ".", "hd.");
		sxTrans.stylesheet=StringUtils.replace(sxTrans.stylesheet,"soap_to_csv_fmifiit.xsl","soap_to_csv_fmifihd.xsl");
		String msg="Erzeuge zusaetzliche Header_Datei "+sxTrans.outfile;
		log.log(Level.INFO, msg);
		System.out.println(msg);
		sxTrans.transformFile("text");
		}
		if (isDeleteTmpXmlFileWanted)
			tempFile.delete();
	}
	private boolean isReplyOk() {
		boolean result = false;
		/**
		 * TODO eigentlich sicherheitshalber gucken unter  - 
		 * I TYPE kommt aber nur einmal vor
		 */
		if (!XMLUtils.hasANodeWithName(resultDocument, "TYPE")) {
			System.out.println(data);
			log.severe(data);
		} else {
			Node type = XMLUtils.getFirstNode(resultDocument, "TYPE");
			if (XMLUtils.getTheValue(type).equals("I"))
				result = true;
		}
		return result;
	}
}