package NFP.Algorithms;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import seg.jUCMNav.nfp.generated.*;

public class ConvertCurrency {
	private double srcValue;
	private Currency srcUnit;
	private Currency convertedUnit;
	private double convertedValue = 0;
	private double currencyRate = 0;

	public double getConvertedValue(double d, Currency srcUnit,
			Currency convertedUnit) throws HttpException, IOException {
		this.srcValue = d;
		this.srcUnit = srcUnit;
		this.convertedUnit = convertedUnit;
		if(this.srcUnit==this.convertedUnit) return this.srcValue;
		String from = this.srcUnit.name();
		String to = this.convertedUnit.name();
		String request = "http://www.webservicex.net/currencyconvertor.asmx/ConversionRate?FromCurrency="
				+ from + "&ToCurrency=" + to;
		System.out.println("Request = " + request);
		HttpClient client = new HttpClient();
		GetMethod method = new GetMethod(request);
		int statusCode = client.executeMethod(method);
		if (statusCode != HttpStatus.SC_OK) {
			System.err.println("Method failed: " + method.getStatusLine());
		}
		InputStream rstream = null;
		rstream = method.getResponseBodyAsStream();
		String s = convertStreamToString(rstream);
		System.out.println(s);
		CreateXML(s);
		return getValue();
	}

	private Boolean CreateXML(String responseXML) {
		try {
			File file = new File("ConvertionRate.xml");
			boolean success = file.createNewFile();
			if (success) {
				NewFile(file, responseXML);
			} else {
				Boolean suc = file.delete();
				if (suc) {
					NewFile(file, responseXML);
				}
			}
		} catch (IOException e) {
		}
		return true;
	}

	private void NewFile(File file, String responseXML) {
		try {
			FileWriter fr = new FileWriter(file, true);
			BufferedWriter out = new BufferedWriter(fr);
			out.write(responseXML);
			out.close();
		} catch (IOException e) {
		}
	}

	private String convertStreamToString(InputStream is) throws IOException {
		if (is != null) {
			Writer writer = new StringWriter();
			char[] buffer = new char[1024];
			try {
				Reader reader = new BufferedReader(new InputStreamReader(is,
						"UTF-8"));
				int n;
				while ((n = reader.read(buffer)) != -1) {
					writer.write(buffer, 0, n);
				}
			} finally {
				// is.close();
			}
			return writer.toString();
		} else {
			return "";
		}
	}

	private double getValue() {
		try {
			File fXmlFile = new File("ConvertionRate.xml");
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder dBuilder;
			dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(fXmlFile);
			doc.getDocumentElement().normalize();
			NodeList nlist = doc.getElementsByTagName("double");
			for (int temp = 0; temp < nlist.getLength(); temp++) {
				Node nNode = nlist.item(temp);
				if (nNode.getNodeType() == Node.ELEMENT_NODE) {
					Element eElement = (Element) nNode;
					String s = eElement.getTextContent();
					try {
						currencyRate = Float.valueOf(s.trim()).floatValue();
						System.out.println("currencyRate = " + currencyRate);
					} catch (NumberFormatException nfe) {
						System.out.println("NumberFormatException: "
								+ nfe.getMessage());
					}
					if (currencyRate != 0)
						convertedValue = currencyRate * srcValue;
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("Converted Value : " + convertedValue);
		return convertedValue;
	}

}
