package com.usai.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.json.JSONObject;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

public class Network
{
	private static final int REQUEST_TIMEOUT = 5 * 1000;// request time out 20
														// secs
	private static final int SO_TIMEOUT = 5 * 1000; // so time out 20 secs;
	public static int AP_USER_AUTH = 1;
	public static int AP_USER_NOT_AUTH = 2;
	public static int AP_USER_NOT_EXIST = 3;
	public static int AP_UPLOAD_SUCCESS = 4;
	public static int AP_UPLOAD_FAIL = 5;
//
	public static final int RESULT_FALSE = 0;
	public static final int RESULT_TRUE = 1;
	public static final int RESULT_NET_ERROR = 3;
	public static final int RESULT_ERROR = 5;
	public static final int RESULT_LOCALFILE_ERROR= 7;
	public static final int RESULT_USERAUTH_ERROR = 9;
//	public static final int RESULT_NOCONNECT = 2;
//	public static final int RESULT_CONNECT = 3;
//	public static final int RESULT_TIMEOUT = 4;
//	public static final int RESULT_RESPONSE_NULL= 6;
//	public static final int RESULT_ERR_USERAUTH= 8;

//	enum RES_VERIFYUSER{RESULT_FALSE,RESULT_TRUE,}
//	public static int PROTOCAL_FALSE = 0;
//	public static int PROTOCAL_TRUE = 1;
//	public static int PROTOCAL_NOT_AUTH = 2;
//	public static int PROTOCAL_SUCCESS = 1;
//	public static int PROTOCAL_FAILED = 1;
	// public static int PROTOCAL_MORE=4;
//	public static int ERR_LOCALFILE = 0;

//	static String URL_JSON_TEST = "http://192.168.23.1/xampp/json_test.php";
//	static String URL_VERIFY_USER = "http://192.168.1.10/xampp/verify_user.php";
//	static String URL_UPLOAD_PHOTO = "http://192.168.1.10/xampp/save_upload_file.php";
	static String URL_VERIFY_USER = "http://69.199.249.16/handset_login.php";
	static String URL_UPLOAD_PHOTO = "http://69.199.249.16/handset.php";

//	public static String VerifyUser(String user, String password,
//			Context context)
//	{
//		String TAG = "net_dbg@VerifyUser";
//		Log.d(TAG, "entry");
//		try
//		{
//			BasicHttpParams httpParams = new BasicHttpParams();
//			HttpConnectionParams.setConnectionTimeout(httpParams,
//					REQUEST_TIMEOUT);
//			HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
//			HttpClient client = new DefaultHttpClient(httpParams);
//			HttpPost post = new HttpPost(URL_VERIFY_USER);
//			MultipartEntity reqEntity = new MultipartEntity(
//					HttpMultipartMode.BROWSER_COMPATIBLE);
//			reqEntity.addPart("user", new StringBody(user));
//			reqEntity.addPart("password", new StringBody(password));
//
//			post.setEntity(reqEntity);
//			HttpResponse response = client.execute(post);
//			int statucode = response.getStatusLine().getStatusCode();
//			if (statucode == HttpStatus.SC_OK)
//			{
//				HttpEntity resEntity = response.getEntity();
//				if (resEntity != null)
//				{
//					Log.d(TAG,
//							"Response: content len==>"
//									+ resEntity.getContentLength());
//					InputStream is = resEntity.getContent();
//					try
//					{
//
//						BufferedReader br = new BufferedReader(
//								new InputStreamReader(is, "utf-8"), 8);
//						StringBuilder sb = new StringBuilder();
//						String line = null;
//						while ((line = br.readLine()) != null)
//						{
//							sb.append(line + "\n");
//						}
//
//						Log.d(TAG, "Response: content begin");
//						Log.d(TAG, sb.toString());
//						Log.d(TAG, "Response: content end");
//						return sb.toString();
//					}
//					catch (Exception e)
//					{
//						Log.e(TAG, e.toString());
//						// TODO: handle exception
//					}
//					finally
//					{
//						is.close();
//
//					}
//
//				}
//				else
//				{
//					/*
//					 * resEntity is null
//					 */
//					Log.d(TAG, "RESPONSE ENTITY IS NULL");
//					return null;
//				}
//
//			}
//			else
//			{
//				/*
//				 * Http error; out put error code;
//				 */
//				Log.d(TAG, "HTTP " + statucode);
//
//				HttpEntity resEntity = response.getEntity();
//				if (resEntity != null)
//				{
//
//					InputStream is = resEntity.getContent();
//					try
//					{
//
//						BufferedReader br = new BufferedReader(
//								new InputStreamReader(is, "utf-8"), 8);
//						StringBuilder sb = new StringBuilder();
//						String line = null;
//						while ((line = br.readLine()) != null)
//						{
//							sb.append(line + "\n");
//						}
//
//						Log.d(TAG, "Response: content begin");
//						Log.d(TAG, sb.toString());
//						Log.d(TAG, "Response: content end");
//						return null;
//					}
//					catch (Exception e)
//					{
//						Log.e(TAG, e.toString());
//						// TODO: handle exception
//					}
//					finally
//					{
//						is.close();
//
//					}
//
//				}
//				else
//				{
//					/*
//					 * resEntity is null
//					 */
//					Log.e(TAG, "RESPONSE ENTITY IS NULL");
//					return null;
//				}
//				return null;
//			}
//
//		}
//		catch (ConnectTimeoutException e)
//		{
//			Log.d(TAG, "request time out");
//
//		}
//		catch (Exception e)
//		{
//			Log.d(TAG, e.toString());
//		}
//		return null;
//	}

	public static int VerifyUser(String user, String password)
	{
		String TAG = "net_dbg@VerifyUser";
		Log.d(TAG, "entry");
		try
		{
			BasicHttpParams httpParams = new BasicHttpParams();
			HttpConnectionParams.setConnectionTimeout(httpParams,
					REQUEST_TIMEOUT);
			HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
			HttpClient client = new DefaultHttpClient(httpParams);
			HttpPost post = new HttpPost(URL_VERIFY_USER);
			MultipartEntity reqEntity = new MultipartEntity(
					HttpMultipartMode.BROWSER_COMPATIBLE);
			reqEntity.addPart("user", new StringBody(user));
			reqEntity.addPart("password", new StringBody(password));

			post.setEntity(reqEntity);
			HttpResponse response = client.execute(post);
			int statucode = response.getStatusLine().getStatusCode();
			if (statucode == HttpStatus.SC_OK)
			{
				HttpEntity resEntity = response.getEntity();
				if (resEntity != null)
				{
					Log.d(TAG,
							"Response: content len==>"
									+ resEntity.getContentLength());
					InputStream is = resEntity.getContent();
					try
					{

						BufferedReader br = new BufferedReader(
								new InputStreamReader(is, "utf-8"), 8);
						StringBuilder sb = new StringBuilder();
						String line = null;
						while ((line = br.readLine()) != null)
						{
							sb.append(line + "\n");
						}

						Log.d(TAG, "Response: content begin");
						Log.d(TAG, sb.toString());
						Log.d(TAG, "Response: content end");

						if (sb.length()<=0)
						{
							
							return RESULT_NET_ERROR;
						}
						JSONObject obj = new JSONObject(sb.toString());
						if (obj.length() > 0)
						{
							// JSONObject obj = array.getJSONObject(0);
							try
							{
								int verifyresult = Integer.parseInt(obj
										.getString("result"));
								if (verifyresult == Network.AP_USER_AUTH)
								{
									return RESULT_TRUE;
								}
								else
								{
									return RESULT_FALSE;
								}
							}
							catch (Exception e)
							{
								Log.e(TAG, e.toString());
								return RESULT_ERROR;
							}
						}
					}
					catch (Exception e)
					{
						Log.e(TAG, e.toString());
						return RESULT_ERROR;
						// TODO: handle exception
					}
					finally
					{
						is.close();

					}

				}
				else
				{
					/*
					 * resEntity is null
					 */
					Log.d(TAG, "RESPONSE ENTITY IS NULL");
					return RESULT_NET_ERROR;
				}

			}
			else
			{
				/*
				 * Http error; out put error code;
				 */
				Log.d(TAG, "HTTP " + statucode);

				HttpEntity resEntity = response.getEntity();
				if (resEntity != null)
				{

					InputStream is = resEntity.getContent();
					try
					{

						BufferedReader br = new BufferedReader(
								new InputStreamReader(is, "utf-8"), 8);
						StringBuilder sb = new StringBuilder();
						String line = null;
						while ((line = br.readLine()) != null)
						{
							sb.append(line + "\n");
						}

						Log.d(TAG, "Response: content begin");
						Log.d(TAG, sb.toString());
						Log.d(TAG, "Response: content end");
						return RESULT_ERROR;
					}
					catch (Exception e)
					{
						Log.e(TAG, e.toString());
						return RESULT_ERROR;
						// TODO: handle exception
					}
					finally
					{
						is.close();

					}

				}
				else
				{
					/*
					 * resEntity is null
					 */
					Log.e(TAG, "RESPONSE ENTITY IS NULL");
					return RESULT_NET_ERROR;
				}
			}

		}
		catch (ConnectTimeoutException e)
		{
			Log.d(TAG, "request time out");
			return RESULT_NET_ERROR;

		}
		catch (Exception e)
		{
			Log.d(TAG, e.toString());
			return RESULT_ERROR;
		}
		return RESULT_ERROR;
	}

	public static int UploadFile( String path, String user,
			String password, String pid)
	{
		String TAG = "net_dbg@UploadFile";
		Log.d(TAG, "entry");

		Log.d(TAG, "sourcefile:" + path);
		File file = new File(path);

		if (file.exists() == false)
			return RESULT_LOCALFILE_ERROR;
		String md5= MD5.md5sum(path);
		Log.d(TAG, "MD5:"+md5);
		if(md5==null)
		{
			Log.d(TAG, "md5 sum failed");
			return RESULT_LOCALFILE_ERROR;
			
		}
		try
		{
			BasicHttpParams httpParams = new BasicHttpParams();
			HttpConnectionParams.setConnectionTimeout(httpParams,
					REQUEST_TIMEOUT);
			HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
			HttpClient client = new DefaultHttpClient(httpParams);
			HttpPost post = new HttpPost(URL_UPLOAD_PHOTO);
			MultipartEntity reqEntity = new MultipartEntity(
					HttpMultipartMode.BROWSER_COMPATIBLE);
			reqEntity.addPart("user", new StringBody(user));
			reqEntity.addPart("password", new StringBody(password));
			reqEntity.addPart("pid", new StringBody(pid));
			reqEntity.addPart("md5", new StringBody(md5));
			
			FileBody bin = new FileBody(file);
			reqEntity.addPart("imagefile", bin);
			post.setEntity(reqEntity);
			HttpResponse response = client.execute(post);
			int statucode = response.getStatusLine().getStatusCode();
			if (statucode == HttpStatus.SC_OK)
			{
				HttpEntity resEntity = response.getEntity();
				if (resEntity != null)
				{
					Log.d(TAG,
							"Response: content len==>"
									+ resEntity.getContentLength());
					InputStream is = resEntity.getContent();
					try
					{

						BufferedReader br = new BufferedReader(
								new InputStreamReader(is, "utf-8"), 8);
						StringBuilder sb = new StringBuilder();
						String line = null;
						while ((line = br.readLine()) != null)
						{
							sb.append(line + "\n");
						}

						Log.d(TAG, "Response: content begin");
						Log.d(TAG, sb.toString());
						Log.d(TAG, "Response: content end");

						if (sb.length()<=0)
						{
							
							return RESULT_NET_ERROR;
						}
						JSONObject obj = new JSONObject(sb.toString());
						if (obj.length() > 0)
						{
							// JSONObject obj = array.getJSONObject(0);
							try
							{
								int uploadresult = Integer.parseInt(obj
										.getString("result"));
								if (uploadresult == Network.AP_UPLOAD_SUCCESS)
								{
									return RESULT_TRUE;
								}
								else if(uploadresult == Network.AP_USER_NOT_AUTH)
								{
									Log.d(TAG,"RESULT_ERR_USERAUTH");
									return RESULT_USERAUTH_ERROR;
								}
								else
								{
									return RESULT_FALSE;
								}
							}
							catch (Exception e)
							{
								Log.e(TAG, e.toString());
								return RESULT_FALSE;
							}
						}
					}
					catch (Exception e)
					{
						Log.e(TAG, e.toString());
						return RESULT_ERROR;
						// TODO: handle exception
					}
					finally
					{
						is.close();

					}

				}
				else
				{
					/*
					 * resEntity is null
					 */
					Log.d(TAG, "RESPONSE ENTITY IS NULL");
					return RESULT_NET_ERROR;
				}

			}
			else
			{
				/*
				 * Http error; out put error code;
				 */
				Log.d(TAG, "HTTP " + statucode);

				HttpEntity resEntity = response.getEntity();
				if (resEntity != null)
				{

					InputStream is = resEntity.getContent();
					try
					{

						BufferedReader br = new BufferedReader(
								new InputStreamReader(is, "utf-8"), 8);
						StringBuilder sb = new StringBuilder();
						String line = null;
						while ((line = br.readLine()) != null)
						{
							sb.append(line + "\n");
						}

						Log.d(TAG, "Response: content begin");
						Log.d(TAG, sb.toString());
						Log.d(TAG, "Response: content end");
						return RESULT_ERROR;
					}
					catch (Exception e)
					{
						Log.e(TAG, e.toString());
						return RESULT_ERROR;
						// TODO: handle exception
					}
					finally
					{
						is.close();

					}

				}
				else
				{
					/*
					 * resEntity is null
					 */
					Log.e(TAG, "RESPONSE ENTITY IS NULL");
					return RESULT_NET_ERROR;
				}
			}

		}
		catch (ConnectTimeoutException e)
		{
			Log.d(TAG, "request time out");
			return RESULT_NET_ERROR;

		}
		catch (Exception e)
		{
			Log.d(TAG, e.toString());
			return RESULT_ERROR;
		}		
		
		return RESULT_FALSE;

//		try
//		{
//			HttpClient client = new DefaultHttpClient();
//			HttpPost post = new HttpPost(url);
//			MultipartEntity reqEntity = new MultipartEntity(
//					HttpMultipartMode.BROWSER_COMPATIBLE);
//			reqEntity.addPart("user", new StringBody(user));
//			reqEntity.addPart("password", new StringBody(password));
//			reqEntity.addPart("pid", new StringBody(pid));
//			FileBody bin = new FileBody(file);
//			reqEntity.addPart("imagefile", bin);
//			post.setEntity(reqEntity);
//			HttpResponse response = client.execute(post);
//			HttpEntity resEntity = response.getEntity();
//			if (resEntity != null)
//			{
//
//				String result = EntityUtils.toString(resEntity);
//				Log.d(TAG, "Response:" + result);
//				return Integer.parseInt(result);
//				// if(Boolean.parseBoolean(result)==true)
//				// return true;
//				// else
//				// return false;
//			}
//
//		}
//		catch (Exception e)
//		{
//			e.printStackTrace();
//		}
//		return 0;
	}

	public static boolean NetworkIsAvailable(Context context)
	{
		String TAG = "net_dbg@CheckNetwork";
		ConnectivityManager connManager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);

		NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
		if (networkInfo == null)
		{
			Log.d(TAG, "can not get Active NetworkInfo!");
			// dbgUtil.Log(Log.DEBUG, "Current Network info",
			// "can not get Active NetworkInfo!");
			return false;
		}
		NetworkInfo.State netState = networkInfo.getState();
		if (netState != NetworkInfo.State.CONNECTED)
		{
			Log.d(TAG, "not Connected!State=" + netState);
			// dbgUtil.Log(Log.DEBUG, "Current Network info",
			// "not Connected!State=" + netState);
			return false;
		}
		// int iconntype = -1;
		// iconntype = networkInfo.getType();

		// boolean bUseMobileNetwork = context.getSharedPreferences(
		// "PhoneAsstPref", 0).getBoolean("UseMobileNetwork", false);
		//
		// if (bUseMobileNetwork == false
		// && iconntype != ConnectivityManager.TYPE_WIFI && iconntype != 9/*
		// earthnet */)
		// {
		// Log.d(TAG,);
		// dbgUtil.Log(Log.DEBUG, "Current Network info",
		// "not allowed!Connection type=" + networkInfo.getTypeName());
		// return false;
		// }
		boolean bavailable = networkInfo.isAvailable();
		String strtype = networkInfo.getTypeName();

		Log.d(TAG, " type = " + strtype + " abailable = " + bavailable
				+ " state " + netState);
		// dbgUtil.Log(Log.INFO, "Current Network info", " type = " + strtype
		// + " abailable = " + bavailable + " state " + netState);
		return bavailable;
	}

}
