package com.voicepro.odata;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.ArrayList;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
import com.actionbarsherlock.view.MenuItem;
import com.voicepro.JobInstance;
import com.voicepro.R;
import com.voicepro.views.AdvertiseUI;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.MediaController;
import android.widget.MediaController.MediaPlayerControl;
import android.widget.Toast;

public class BraniList extends SherlockActivity {

	private ProgressDialog m_ProgressDialog = null;
	public ArrayList<BraniCatalog> m_orders = new ArrayList<BraniCatalog>();
	public ArrayList<CharSequence> m_categorie = new ArrayList<CharSequence>();
	private BackGroundAdapter m_adapter;
	private ListView listViewinApp;
	private Button btnretryDownload;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.inapplist);

		getSupportActionBar().setDisplayShowCustomEnabled(false);
		getSupportActionBar().setDisplayHomeAsUpEnabled(true);
		Context context = getSupportActionBar().getThemedContext();

		m_categorie.add("All");

		getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
		ArrayAdapter<CharSequence> listAdapter = new ArrayAdapter<CharSequence>(context, R.layout.sherlock_spinner_item, m_categorie);

		listAdapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);

		listViewinApp = (ListView) findViewById(R.id.listViewinApp);
		btnretryDownload = (Button) findViewById(R.id.btnretryDownload);
		btnretryDownload.setOnClickListener(new btnretryDownload_click());

		View listViewEmpty = findViewById(R.id.emptyinappList);
		listViewinApp.setEmptyView(listViewEmpty);

		getSupportActionBar().setListNavigationCallbacks(listAdapter, new OnNavigationListener() {

			@Override
			public boolean onNavigationItemSelected(int itemPosition, long itemId) {
				if (itemId > 0) {
					m_adapter.getFilter().filter(String.valueOf(itemPosition + 11));
					m_adapter.notifyDataSetChanged();
					return true;
				} else {
					if (m_adapter != null) {
						m_adapter.getFilter().filter("");
						m_adapter.notifyDataSetChanged();
						return true;
					}

				}
				return false;

			}
		});

		final CharSequence[] contextMenu = new CharSequence[] { getString(R.string.download), getString(R.string.preview) };

		listViewinApp.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> myAdapter, View myView, int myItemInt, long mylng) {
				final BraniCatalog item = (BraniCatalog) listViewinApp.getItemAtPosition(myItemInt);

				AlertDialog.Builder builder = new AlertDialog.Builder(BraniList.this);
				builder.setIcon(R.drawable.icon);
				builder.setTitle(R.string.actions);
				builder.setItems(contextMenu, new OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						switch (which) {
						case 0:
							new DownloadSong(BraniList.this).execute(new BraniCatalog[] { item });
							break;

						case 1:
							PreviewSong(item);
							break;

						default:
							break;
						}

					}

				});

				AlertDialog alertDialog = builder.create();
				alertDialog.show();

			}
		});

		listViewinApp.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView<?> myAdapter, View myView, int myItemInt, long mylng) {
				return false;

			}
		});

		new AsyncTask<Integer, Integer, Integer>() {

			@Override
			protected void onPreExecute() {
				m_ProgressDialog = ProgressDialog.show(BraniList.this, getString(R.string.please_wait), getString(R.string.retrieving_data), true, true);
				super.onPreExecute();
			}

			@Override
			protected void onPostExecute(Integer result) {
				m_adapter = new BackGroundAdapter(BraniList.this, R.layout.inapprow, m_orders);
				listViewinApp.setAdapter(m_adapter);
				m_adapter.notifyDataSetChanged();
				m_ProgressDialog.dismiss();
				super.onPostExecute(result);
			}

			@Override
			protected Integer doInBackground(Integer... params) {
				getOrders();
				return 1;
			}

		}.execute(1);

	}

	public class btnretryDownload_click implements android.view.View.OnClickListener {

		@Override
		public void onClick(View v) {

			// viewOrders = new Runnable() {
			// @Override
			// public void run() {
			// getOrders();
			// }
			// };
			// Thread thread = new Thread(null, viewOrders,
			// "MagentoBackground");
			// thread.start();
		}

	}

	@Override
	protected void onDestroy() {

		super.onDestroy();
	}

	@Override
	protected void onPause() {
		overridePendingTransition(0, 0);
		super.onPause();
	}

	private void getOrders() {
		try {

			ODataInteface odata = new ODataInteface(this);
			m_orders.addAll(odata.Res_GetLista());
			m_categorie.addAll(odata.Rest_GetCategorie());
			Log.i("ARRAY", "" + m_orders.size());
		} catch (Exception e) {
			e.printStackTrace();
		}
		// runOnUiThread(returnRes);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home:
			onBackPressed();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	private class DownloadSong extends AsyncTask<BraniCatalog, Integer, Boolean> {
		@Override
		protected void onPostExecute(Boolean result) {
			Activity activity = mContext.get();
			if (activity != null) {
				if (!activity.isFinishing())
					mProgress.dismiss();

				if (result) {
					Toast.makeText(activity, "Download successfully, check the Records list.", Toast.LENGTH_LONG).show();
					m_adapter.notifyDataSetChanged();
				} else {
					Toast.makeText(activity, "Download problem, please try later.", Toast.LENGTH_LONG).show();
				}
			}
		}

		private ProgressDialog mProgress;
		private WeakReference<BraniList> mContext;

		public DownloadSong(BraniList context) {

			mContext = new WeakReference<BraniList>(context);
		}

		@Override
		protected void onPreExecute() {
			mProgress = new ProgressDialog(mContext.get());
			mProgress.setTitle("Downloading....");
			mProgress.setIcon(R.drawable.icon);
			mProgress.setIndeterminate(false);
			mProgress.setCancelable(false);
			mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mProgress.setOnCancelListener(new ProgressDialog.OnCancelListener() {

				public void onCancel(DialogInterface dialog) {
					cancel(true);
					dialog.dismiss();

					Context ctxt = mContext.get();
					if (ctxt != null) {
						Toast.makeText(ctxt, R.string.stop, Toast.LENGTH_SHORT).show();
					}
				}
			});

			mProgress.show();
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			if (!mProgress.isShowing()) {
				mProgress.show();
			}

			// mProgress.setProgressNumberFormat("%1d kb / %2d kb");
			mProgress.setProgress(values[0].intValue());
			mProgress.setMax(values[1].intValue());
		}

		@Override
		protected Boolean doInBackground(BraniCatalog... params) {
			try {
				int count;

				//
				//
				AdvertiseUI ads = new AdvertiseUI(BraniList.this);
				try {

					final String username = new String(ads.unshow(getString(R.string.server_username))).trim();
					final String password = new String(ads.unshow(getString(R.string.server_password))).trim();
					Authenticator.setDefault(new Authenticator() {
						protected PasswordAuthentication getPasswordAuthentication() {
							return new PasswordAuthentication(username, password.toCharArray());
						}
					});

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

				String nomeFile = params[0].name;
				URL url = new URL(params[0].link);

				HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

				urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 ( compatible ) ");
				urlConnection.setRequestProperty("Accept", "[star]/[star]");

				urlConnection.setRequestMethod("GET");
				urlConnection.setDoOutput(false);
				urlConnection.connect();

				JobInstance tempJob = new JobInstance(BraniList.this, "mp3");
				tempJob.setName(nomeFile);
				File file = tempJob.getFinalfileposition();
				FileOutputStream fileOutput = new FileOutputStream(file);
				InputStream inputStream = new BufferedInputStream(url.openStream());
				int totalSize = urlConnection.getContentLength();

				byte[] buffer = new byte[1024];
				long total = 0;

				while ((count = inputStream.read(buffer)) != -1) {
					total += count;
					// publishing the progress....
					publishProgress(new Integer[] { (int) (total), (int) (totalSize) });
					fileOutput.write(buffer, 0, count);
				}

				fileOutput.flush();
				fileOutput.close();
				inputStream.close();
				tempJob.setImported(true);
				tempJob.setBackGround(true);
				tempJob.saveToDatabase(null);

			} catch (MalformedURLException e) {
				e.printStackTrace();
				return false;
			} catch (IOException e) {
				e.printStackTrace();
				return false;
			}
			return true;
		}

	}

	private void PreviewSong(BraniCatalog item) {

		MediaPlayer mp = new MediaPlayer();
		mp.setOnPreparedListener(mp_onPrepare);
		try {
			mp.setDataSource(item.link);
		} catch (IllegalArgumentException e) {

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

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

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

			e.printStackTrace();
		}
		try {
			mp.prepareAsync();
		} catch (IllegalStateException e) {

			e.printStackTrace();
		}

	}

	private OnPreparedListener mp_onPrepare = new OnPreparedListener() {

		private MediaController mediaController;

		@Override
		public void onPrepared(final MediaPlayer mp) {
			mediaController = new MediaController(BraniList.this);
			mediaController.setMediaPlayer(new MediaPlayerControl() {

				@Override
				public void start() {
					mp.start();

				}

				@Override
				public void seekTo(int pos) {
					mp.seekTo(pos);

				}

				@Override
				public void pause() {
					mp.pause();

				}

				@Override
				public boolean isPlaying() {

					return mp.isPlaying();
				}

				@Override
				public int getDuration() {

					return mp.getDuration();
				}

				@Override
				public int getCurrentPosition() {

					return mp.getCurrentPosition();
				}

				@Override
				public int getBufferPercentage() {

					return 0;
				}

				@Override
				public boolean canSeekForward() {

					return true;
				}

				@Override
				public boolean canSeekBackward() {

					return true;
				}

				@Override
				public boolean canPause() {

					return true;
				}
			});
			mediaController.setAnchorView(findViewById(R.id.emptyinappList));
			mediaController.show(0);
			mp.start();

		}
	};

}