package com.artisanalapps;

import java.util.ArrayList;
import java.util.List;

import com.artisanalapps.AddRecord.MyOnItemSelectedListener;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;

public class RecordCollectionView extends ListActivity implements
		OnItemClickListener {
	
	private ProgressDialog progressDialog = null;
	private List<Record> records = null;
	private EntryAdapter adapter;
	private RecordCollectionDataHelper recordFetcher;
	private Runnable showResults;
	private int conditionInt = -1;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.collection_view);
		
		refreshPage();	
	}
	
	public void refreshPage(){
		// create an ArrayList of records and bind it to an Adapter
		records = new ArrayList<Record>();
		this.adapter = new EntryAdapter(this, R.layout.record_item, records);
		
		// create a ListView 
		ListView list = getListView();
		list.setAdapter(this.adapter);
		list.setOnItemClickListener(this);
		
		// do the work of querying database in getResults in a Runnable/separate
		// thread
		showResults = new Runnable() {
			public void run() {
				getResults();
			}
		};
		
		reloadEntries(); // initialize	
	}
	
	// when an item is clicked, an activity based on parameters from that item
	// is started
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		Record rec = records.get((int) id);
		updateOrDelete(rec);
	}
	
	protected void onPause() {
		super.onPause();
		// need to get rid of progressDialog
		progressDialog.dismiss();
	}

	// creates a new thread for the SQLite3 database queries
	private void reloadEntries() {
		adapter.clear();
		Thread thread = new Thread(null, showResults,
				"RecordCollectionResultsBackground");
		thread.start();
		progressDialog = ProgressDialog.show(this,
				"Please wait...", "Retrieving data ...", true);
	}
	
	// this function does the work of this activity - uses a database adapter
	// to make queries to the SQLite3 database
	private void getResults() {
		recordFetcher = new RecordCollectionDataHelper(getApplicationContext());
		try {
			records = recordFetcher.viewCollection(); 
		}
		catch (Exception e) {
			showMessage(e.getMessage());
		}
		// the message to return to the UIThread when
		// results have been found and completed
		runOnUiThread(returnResults);
		
	}
	
	// Runnable that returns results to UI thread - if no results
	// are found, then a message is given to the user
	private Runnable returnResults = new Runnable() {
		public void run() {
			if (records != null && records.size() > 0) {
				adapter.notifyDataSetChanged();
				for (int i = 0; i < records.size(); i++)
					adapter.add(records.get(i));
			} else {
				TextView search_records = (TextView) findViewById(R.id.results_text);
				search_records.setText(R.string.no_records);
			}
			progressDialog.dismiss();
			adapter.notifyDataSetChanged();
		}
	};

	
	// The EntryAdapter class binds each Record object to a record_item layout
	private class EntryAdapter extends ArrayAdapter<Record> {
		private List<Record> items;

		public EntryAdapter(Context context, int textViewResourceId,
				List<Record> items) {
			super(context, textViewResourceId, items);
			this.items = items;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			
			// ViewHolder keeps references to children views avoiding 
			// findViewById() calls on each row.
			ViewHolder holder;
			
			View v = convertView;
			if (v == null) {
				LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				v = vi.inflate(R.layout.record_item, null);
				// Create the ViewHolder and bind the data to it - note this is only done
				// when the view is null
				holder = new ViewHolder();
				holder.artist = (TextView) v.findViewById(R.id.record_artist);
				holder.title = (TextView) v.findViewById(R.id.record_title);
				holder.label = (TextView) v.findViewById(R.id.record_label);
				holder.catalog = (TextView) v.findViewById(R.id.record_catalog);
				holder.condition = (TextView) v.findViewById(R.id.record_condition);
				
				v.setTag(holder);
			}
			else {
				// get holder back - fast access to TextViews and Button
				holder = (ViewHolder) v.getTag();
			}

			final Record rec = items.get(position);
			if (rec != null) {
				holder.artist.setText("" + rec.getArtist());
				holder.title.setText("" + rec.getTitle());
				holder.label.setText("" + rec.getLabel() + " ");
				holder.catalog.setText("" + rec.getCatalog());
				holder.condition.setText("" + rec.conditionToString() + " ");
			}

			return v;
		}
		
	}

	static class ViewHolder {
		TextView artist, title, label, catalog, condition;
	}
	
	public void updateOrDelete(Record record){
		
		final Record rec = record;
		final RecordCollectionDataHelper sqliteHelper = new RecordCollectionDataHelper(getApplicationContext());
		
		String message = "Please update the condition or delete this record.";
		final Spinner condition = new Spinner(this);
		ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter.createFromResource(
				this, R.array.condition_array, android.R.layout.simple_spinner_item);
		spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		condition.setAdapter(spinnerAdapter);
		
		condition.setOnItemSelectedListener(new MyOnItemSelectedListener());
		

		new AlertDialog.Builder(this)
	    .setTitle("Update Condition or Delete")
	    .setMessage(message)
	    .setView(condition)
	    .setPositiveButton("Update Condition", new DialogInterface.OnClickListener() {
	        public void onClick(DialogInterface dialog, int whichButton) {
	        	try {
	        		System.out.println("conditionInt is " + conditionInt);
	            	sqliteHelper.update(rec, conditionInt);
	            	refreshPage();
	        	}
	        //  PLEASE DO SOMETHING BETTER THAN THIS!
	    		catch (Exception e){
	    			System.out.println("oops... " + e.getMessage());
	    			
	    		}
	        }
	    }).setNegativeButton("Delete Record", new DialogInterface.OnClickListener() {
	        public void onClick(DialogInterface dialog, int whichButton) {
	        	try {
	    			sqliteHelper.delete(rec);
	    			refreshPage();
	    		}
	    		//  PLEASE DO SOMETHING BETTER THAN THIS!
	    		catch (Exception e){
	    			System.out.println("oops... " + e.getMessage());
	    			
	    		}
	        }
	    }).show();
	}
	
	public class MyOnItemSelectedListener implements OnItemSelectedListener {

	    public void onItemSelected(AdapterView<?> parent,
	        View view, int pos, long id) {
	    		conditionInt = pos;
	    }

	    public void onNothingSelected(AdapterView parent) {
	      // Do nothing.
	    }
	}
	
	// Displays a message to the user via Toast
	public void showMessage(CharSequence txt) {

		Toast t = Toast.makeText(this, txt, Toast.LENGTH_SHORT);
		t.setGravity(Gravity.BOTTOM, 0, 0);
		t.show();
	}



}
