package com.ethostream.ethoandroid;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URI;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.concurrent.ExecutionException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.ToggleButton;

public class AddDevice extends Activity
{
	
private static final String REMOTE_QUERY_SITE = "http://android.telkonet.com/dbdeviceinfo.php";
private static final String REMOTE_INSERT_SITE = "http://android.telkonet.com/dbinsert.php";
	
	private static final String DEVICE_ID = "ID";
	private static final String DEVICE_NAME = "Name";
	private static final String DEVICE_LOCATION = "Location";
	private static final String DEVICE_MAC= "MacAddress";
	private static final String DEVICE_IP = "IP";
	private static final String DEVICE_CHANNEL = "Channel";
	private static final String DEVICE_USER = "Username";
	private static final String DEVICE_PASSWD = "Password";
	private static final String DEVICE_PARENT = "Parent";
	private static final String DEVICE_PROPID = "PropertyID";
	private static final String DEVICE_TYPE = "DeviceType";
	private static final String DEVICE_OKIFRED = "NoMonitor";
	private static final String DEVICE_STATUS = "Status";
	private static final String DEVICE_LASTGOOD = "LastGood";
	private static final String DEVICE_LASTFAIL = "LastFailed";
	private static final String DEVICE_DIRECTURL = "DirectURL";
	private static final String DEVICE_VID = "VID";
	private static final int SEND_DATA_FAILED = 0;
	
	private int deviceID = 0;
	private int propID = 0;
	private ContentValues deviceinfo = new ContentValues();
	private Context context;
	private TextView location;
	private TextView ip;
	private TextView mac;
	private TextView url;
	private TextView channel;
	private TextView username;
	private TextView password;
	private TextView vlanid;
	private Spinner name;
	private Spinner type;
	private Spinner parent;
	private ToggleButton okred;
	
	private ArrayList<ContentValues> parentList = new ArrayList<ContentValues>();
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		context = this;
		
		Bundle bundle = getIntent().getExtras();
		deviceID = Integer.parseInt(bundle.getString("DID"));
		propID = Integer.parseInt(bundle.getString("PID"));
		@SuppressWarnings("unchecked")
		ArrayList<ContentValues> tmpList = (ArrayList<ContentValues>) bundle.getSerializable("PARENTS");
		parentList = tmpList;
		Comparator<ContentValues> compare = new compareParentIP();
		Collections.sort(parentList, compare);
		if (deviceID < 0)
		{
			Log.e(this.toString(), "Invalid ID, quitting.");
			setResult(RESULT_CANCELED);
			finish();
		}
		setContentView(R.layout.adddevice);
		location = (TextView) findViewById(R.id.adddevice_location);
		ip = (TextView) findViewById(R.id.adddevice_ip);
		mac = (TextView) findViewById(R.id.adddevice_mac);
		url = (TextView) findViewById(R.id.adddevice_directurl);
		channel = (TextView) findViewById(R.id.adddevice_channel);
		username = (TextView) findViewById(R.id.adddevice_username);
		password = (TextView) findViewById(R.id.adddevice_password);
		vlanid = (TextView) findViewById(R.id.adddevice_vlanid);
		name = (Spinner) findViewById(R.id.adddevice_name);
		type = (Spinner) findViewById(R.id.adddevice_type);
		parent = (Spinner) findViewById(R.id.adddevice_parent);
	    ArrayAdapter<CharSequence> nameAdapter = ArrayAdapter.createFromResource(this, R.array.adddevice_name_array, android.R.layout.simple_spinner_item);
	    ArrayAdapter<CharSequence> typeAdapter = ArrayAdapter.createFromResource(this, R.array.adddevice_type_array, android.R.layout.simple_spinner_item);
	    ArrayAdapter<CharSequence> parentAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item);
	    parentAdapter.add("None");
		for (int i = 0; i < parentList.size(); i++)
		{
			parentAdapter.add(parentList.get(i).getAsString(DEVICE_IP));
		}
		nameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	    typeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	    parentAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	    name.setAdapter(nameAdapter);
	    type.setAdapter(typeAdapter);
	    parent.setAdapter(parentAdapter);
		
	    
	    // THIS IS AN EXISTING DEVICE
		if (deviceID > 0)
		{
			for (int i = 0; i < parentList.size(); i++)
			{
				if (parentList.get(i).getAsInteger(DEVICE_ID).equals(deviceID))
				{
					deviceinfo = parentList.get(i);
				}
			}
	
			location.setText(deviceinfo.getAsString(DEVICE_LOCATION));
			ip.setText(deviceinfo.getAsString(DEVICE_IP));
			mac.setText(deviceinfo.getAsString(DEVICE_MAC));
			url.setText(deviceinfo.getAsString(DEVICE_DIRECTURL));
			channel.setText(deviceinfo.getAsString(DEVICE_CHANNEL));
			username.setText(deviceinfo.getAsString(DEVICE_USER));
			password.setText(deviceinfo.getAsString(DEVICE_PASSWD));
			vlanid.setText(deviceinfo.getAsString(DEVICE_VID));
			 
		    // Set Parent Field
		    if (deviceinfo.getAsInteger(DEVICE_PARENT).equals(0))
		    {
		    	parent.setSelection(0);
		    }
		    else
		    {
			    for (int i = 0; i < parentList.size(); i++)
			    {
			    	if (parentList.get(i).getAsString(DEVICE_ID).equals(deviceinfo.getAsString(DEVICE_PARENT)))
			    	{
			    		Log.i(this.toString(), parentList.get(i).getAsString(DEVICE_ID) + " - " + deviceinfo.getAsString(DEVICE_PARENT));
			    		parent.setSelection(i+1);
			    	}
			    }
		    }
		    
		    // Set OK If Red Field
		    okred = (ToggleButton) findViewById(R.id.adddevice_okifred);
		    
		    if (deviceinfo.getAsInteger(DEVICE_OKIFRED).equals(1))
		    {
		    	okred.setChecked(true);
		    }
		        
		    // DEVICE NAME SPINNER SWITCH
		    if (deviceinfo.getAsString(DEVICE_NAME).equals("Wired"))
		    {
		    	name.setSelection(0);
		    }
		    else if (deviceinfo.getAsString(DEVICE_NAME).equals("PLC"))
		    {
		    	name.setSelection(1);
		    }
		    else if (deviceinfo.getAsString(DEVICE_NAME).equals("WDS"))
		    {
		    	name.setSelection(2);
		    }
		    else if (deviceinfo.getAsString(DEVICE_NAME).equals("DLS"))
		    {
		    	name.setSelection(3);
		    }
		    else if (deviceinfo.getAsString(DEVICE_NAME).equals("POE"))
		    {
		    	name.setSelection(4);
		    }
		    else if (deviceinfo.getAsString(DEVICE_NAME).equals("Fiber"))
		    {
		    	name.setSelection(5);
		    }
		    // END DEVICE NAME SPINNER SWITCH
		    
		    // DEVICE TYPE SPINNER SWITCH
		    if (deviceinfo.getAsString(DEVICE_TYPE).equals("Ruckus AP"))
		    {
		    	type.setSelection(0);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Ruckus Coordinator"))
		    {
		    	type.setSelection(1);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("POE Switch"))
		    {
		    	type.setSelection(2);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Managed Switch"))
		    {
		    	type.setSelection(3);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("P520"))
		    {
		    	type.setSelection(4);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("P320"))
		    {
		    	type.setSelection(5);
		    }
			else if (deviceinfo.getAsString(DEVICE_TYPE).equals("ePoint"))
		    {
		    	type.setSelection(6);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Misc AP"))
		    {
		    	type.setSelection(7);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("HPNA Concentrator"))
		    {
		    	type.setSelection(8);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("xDSL Concentrator"))
		    {
		    	type.setSelection(9);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Telkonet Gateway"))
		    {
		    	type.setSelection(10);
		    }
			else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Telkonet eXtender"))
		    {
		    	type.setSelection(11);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Misc"))
		    {
		    	type.setSelection(12);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("xDSL Modem"))
		    {
		    	type.setSelection(13);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Printer"))
		    {
		    	type.setSelection(14);
		    }
		    else if (deviceinfo.getAsString(DEVICE_TYPE).equals("Zigbee Coordinator"))
		    {
		    	type.setSelection(15);
		    }
		    // END DEVICE TYPE SPINNER SWITCH
		}
		
	}
	
	 protected Dialog onCreateDialog(int id) 
	    {
	    	Dialog dialog;
	    	AlertDialog.Builder builder;
	    	AlertDialog alert;
	    	switch(id) 
	    	{
	    		case SEND_DATA_FAILED:
	    			builder = new AlertDialog.Builder(this);
	    			builder.setMessage(this.getString(R.string.dialog_adddevice_send_failed))
	    			.setCancelable(false)
	    			.setPositiveButton(this.getString(R.string.dialog_adddevice_send_failed_yes), new DialogInterface.OnClickListener() 
	    				{
	    				public void onClick(DialogInterface dialog, int id) 
	    				{
	    					//Do something
	    				}
	    			});
	    			alert = builder.create();
	    			dialog = alert;
	    			break;
	    		default:
	    			dialog = null;
	    	}
	    	return dialog;
	    }
	
	private class compareParentIP implements Comparator<ContentValues>
	{
		public int compare(ContentValues object1, ContentValues object2)
		{
			byte[] bytes1;
			byte[] bytes2;
			try
			{
				bytes1 = InetAddress.getByName(object1.getAsString(DEVICE_IP)).getAddress();
				bytes2 = InetAddress.getByName(object2.getAsString(DEVICE_IP)).getAddress();
			} catch (UnknownHostException e)
			{
				return object1.getAsString(DEVICE_IP).compareTo(object2.getAsString(DEVICE_IP));
			}
			if (bytes1.length == bytes2.length)
			{
				for (int i = 0; i < bytes1.length; i++)
				{
					if (bytes1[i] != bytes2[i])
					{
						return bytes1[i] - bytes2[i];
					}
				}
			}
			return object1.getAsString(DEVICE_IP).compareTo(object2.getAsString(DEVICE_IP));
		}
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) 
	{
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.adddevice_menu, menu);
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) 
	{
		// Handle item selection
		switch (item.getItemId()) 
		{
			case R.id.adddevice_menu_save_changes:
				// Do something
				if (remoteInsert())
				{
					finish();
				}
				else
				{
					showDialog(SEND_DATA_FAILED);
				}
				return true;
			default:
				return super.onOptionsItemSelected(item);
		}
	}
	
	private boolean remoteInsert()
    {
    	InputStream is = null;
		ArrayList<NameValuePair> queryResult = new ArrayList<NameValuePair>();
		
		deviceinfo.clear();
		deviceinfo.put(DEVICE_NAME, name.getSelectedItem().toString());
		deviceinfo.put(DEVICE_LOCATION, location.getText().toString());
		deviceinfo.put(DEVICE_MAC, mac.getText().toString());
		deviceinfo.put(DEVICE_IP, ip.getText().toString());
		deviceinfo.put(DEVICE_CHANNEL, channel.getText().toString());
		deviceinfo.put(DEVICE_USER, username.getText().toString());
		deviceinfo.put(DEVICE_PASSWD, password.getText().toString());
		deviceinfo.put(DEVICE_DIRECTURL, url.getText().toString());
		deviceinfo.put(DEVICE_PROPID, Integer.toString(propID));
		deviceinfo.put(DEVICE_TYPE, type.getSelectedItem().toString());
		deviceinfo.put(DEVICE_VID, vlanid.getText().toString());
		/*
		if (okred.isSelected())
		{
			deviceinfo.put(DEVICE_OKIFRED, "1");
		}
		else
		{
			deviceinfo.put(DEVICE_OKIFRED, "0");
		}
		*/
		deviceinfo.put(DEVICE_OKIFRED, "0");
		//TODO: Fix okifred button
		//
		if (parent.getSelectedItemPosition() == 0)
		{
			deviceinfo.put(DEVICE_PARENT, "0");
		}
		else
		{
			deviceinfo.put(DEVICE_PARENT, parentList.get(parent.getSelectedItemPosition() - 1).getAsString(DEVICE_PARENT).toString());
		}
		deviceinfo.put(DEVICE_ID, Integer.toString(deviceID));
		
		String activity = "";
		if (deviceID == 0)
		{
			activity = "adddevice";
		}
		else
		{
			activity = "editdevice";
		}
		
		
		//httpPost
		try
		{
			HttpClient httpclient = new DefaultHttpClient();
			
			URI uri = new URI(
			        "http", 
			        "android.telkonet.com", 
			        "/dbinsert.php",
			        "activity=" + activity + "&" +
					DEVICE_NAME + "=" + deviceinfo.getAsString(DEVICE_NAME) + "&" +
					DEVICE_LOCATION + "=" + deviceinfo.getAsString(DEVICE_LOCATION) + "&" +
					DEVICE_MAC + "=" + deviceinfo.getAsString(DEVICE_MAC) + "&" +
					DEVICE_IP + "=" + deviceinfo.getAsString(DEVICE_IP) + "&" +
					DEVICE_CHANNEL + "=" + deviceinfo.getAsString(DEVICE_CHANNEL) + "&" +
					DEVICE_USER + "=" + deviceinfo.getAsString(DEVICE_USER) + "&" +
					DEVICE_PASSWD + "=" + deviceinfo.getAsString(DEVICE_PASSWD) + "&" +
					DEVICE_PARENT + "=" + deviceinfo.getAsString(DEVICE_PARENT) + "&" +
					DEVICE_PROPID + "=" + deviceinfo.getAsString(DEVICE_PROPID) + "&" +
					DEVICE_TYPE + "=" + deviceinfo.getAsString(DEVICE_TYPE) + "&" +
					DEVICE_OKIFRED + "=" + deviceinfo.getAsString(DEVICE_OKIFRED) + "&" +
					DEVICE_DIRECTURL + "=" + deviceinfo.getAsString(DEVICE_DIRECTURL) + "&" +
					DEVICE_VID + "=" + deviceinfo.getAsString(DEVICE_VID) + "&" +
					DEVICE_ID + "=" + deviceinfo.getAsString(DEVICE_ID),
			        null);
			String url = uri.toASCIIString();
			HttpPost httppost = new HttpPost(url);
			httppost.setEntity(new UrlEncodedFormEntity(queryResult));
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent();
			if(is.toString().length() > 0)
			{
				// Assume failure on any message from the server
				return false;
			}
		}
		catch(Exception e)
		{
			Log.e(this.toString(), "Error in http connection"+e.toString());
			return false;
		}
		return true;
    }
	
}
