package framework.network;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;

import android.app.Activity;
import android.os.AsyncTask;

abstract public class HttpAsyncConnection extends AsyncTask<Void, Void, String> {

	private HttpURLConnection conn;
	private StringBuffer message = new StringBuffer();
	protected Activity activity = null;
	private static String clientSessionID = null;


	public HttpAsyncConnection(String url) {
		try {
			conn = (HttpURLConnection) new URL(url).openConnection();
		} catch (MalformedURLException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}
	}
	public HttpAsyncConnection(String url,Activity activity) {
		this(url);
		this.activity = activity;
		try {
			conn = (HttpURLConnection) new URL(url).openConnection();
		} catch (MalformedURLException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}
	}

	@Override
	protected String doInBackground(Void... urls) {
		doPost();
		return doGet();
	}

	// Parse XML
	public void onPostExecute(String result) {
	//	CLLog.debug(""+result);
		DocumentBuilderFactory  factory = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			InputSource is = new InputSource();
			is.setCharacterStream(new StringReader(result));
			Document dom = builder.parse(is);
			Element root = dom.getDocumentElement();
			receive(root);
		}catch(Exception e)  {
			e.printStackTrace();
		}
	}

	abstract protected void receive(Element root);

	// request
	public void doPost() {
		try {
			conn.setReadTimeout(10000 /* milliseconds */);
			conn.setConnectTimeout(15000 /* milliseconds */);
			// POST or GET
			conn.setRequestMethod("POST");
			//conn.setRequestMethod("GET");

			conn.setDoOutput(true);
			if(clientSessionID != null) {
				conn.setRequestProperty("Cookie", clientSessionID);
			}
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
			writer.write(message.toString());
			message.delete(0,message.length());
			writer.flush();
			writer.close();


			if(clientSessionID == null ) {
				clientSessionID = conn.getHeaderField("Set-Cookie");

			}
		} catch (IOException e) {
			notConnection();
			e.printStackTrace();
		}
	}

	// response
	public String doGet() {
		BufferedReader reader;
		try {
			reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			StringBuilder builder = new StringBuilder();
			while((line = reader.readLine()) != null)
				builder.append(line);
			reader.close();
			return builder.toString();
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}

	}

	public void notConnection(){};

	/**
	 *  param set
	 * @param key
	 * @param value
	 */
	public void addParam(String key, String value) {
		if(message.length() > 0) {
			message.append("&");
		}
		message.append(key+"="+value);
	}

	public Activity getActivity() {
		return activity;
	}

	public void setActivity(Activity activity) {
		this.activity = activity;


	}
}
