package com.example.fideliza;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class IniciaMaps extends ListActivity implements LocationListener {

	public AdaptadorCursorLugares adaptador;
	private LocationManager manejador;
	private Location mejorLocaliz;
	private long id_menor;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_inicia_maps);
		Lugares.indicializaBD(this);
		adaptador = new AdaptadorCursorLugares(this, Lugares.listado()); // inicializa
																			// el
																			// listado
																			// y
																			// actualiza
																			// las
																			// distancias
		adaptador.changeCursor(Lugares.listado_ordenado()); // ordenado por
															// distancia
		setListAdapter(adaptador);
		manejador = (LocationManager) getSystemService(LOCATION_SERVICE);
		if (manejador.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
			actualizaMejorLocaliz(manejador
					.getLastKnownLocation(LocationManager.GPS_PROVIDER));
		}
		if (manejador.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
			actualizaMejorLocaliz(manejador
					.getLastKnownLocation(LocationManager.NETWORK_PROVIDER));
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		activarProveedores();
	}

	private void activarProveedores() {
		if (manejador.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
			manejador.requestLocationUpdates(LocationManager.GPS_PROVIDER,
					20 * 1000, 5, this); // actualizacion cada 20 seg.,
											// distancia mínima 5 metros
		}
		if (manejador.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
			manejador.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
					10 * 1000, 10, this); // actualizacion cada 10 seg.,
											// distancia mínima 5 metros
		}
	}

	@Override
	protected void onPause() {
		super.onPause();
		manejador.removeUpdates(this);

	}

	@Override
	public void onLocationChanged(Location location) {
		Log.d(Lugares.TAG, "Nueva localización: " + location);
		actualizaMejorLocaliz(location);
	}

	@Override
	public void onProviderDisabled(String proveedor) {
		Log.d(Lugares.TAG, "Se deshabilita: " + proveedor);
		activarProveedores();
	}

	@Override
	public void onProviderEnabled(String proveedor) {
		Log.d(Lugares.TAG, "Se habilita: " + proveedor);
		activarProveedores();
	}

	@Override
	public void onStatusChanged(String proveedor, int estado, Bundle extras) {
		Log.d(Lugares.TAG, "Cambia estado: " + proveedor);
		activarProveedores();
	}

	private static final long DOS_MINUTOS = 2 * 60 * 1000;

	private void actualizaMejorLocaliz(Location localiz) {
		if (localiz != null
				&& (mejorLocaliz == null
						|| localiz.getAccuracy() < 2 * mejorLocaliz
								.getAccuracy() || localiz.getTime()
						- mejorLocaliz.getTime() > DOS_MINUTOS)) {
			Log.d(Lugares.TAG, "Nueva mejor localización");
			mejorLocaliz = localiz;
			Lugares.posicionActual.setLatitud(localiz.getLatitude());
			Lugares.posicionActual.setLongitud(localiz.getLongitude());
			actualizaLista();
			}
	}

	public void lanzarVistaLugar(View view) {
		final EditText entrada = new EditText(this);
		entrada.setText("0");
		new AlertDialog.Builder(this).setTitle("Selección de lugar")
				.setMessage("indica su id:").setView(entrada)
				.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int whichButton) {
						long id = Long.parseLong(entrada.getText().toString());
						Intent i = new Intent(IniciaMaps.this, VistaLugar.class);
						i.putExtra("id", id);
						startActivity(i);

					}
				}).setNegativeButton("Cancelar", null).show();
	}

	public void lanzarVistaLugar3(View view) {
		id_menor = adaptador.getId_menor();
		Intent i = new Intent(IniciaMaps.this, VistaLugar.class);
		i.putExtra("id", id_menor);
		startActivity(i);

	}

	public void lanzarAcercaDe(View view) {
		Intent i = new Intent(this, AcercaDe.class);
		startActivity(i);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_buscar:
			// lanzarVistaLugar(null); Busqueda por ID, no usado en esta versión
			lanzarVistaLugar3(null); // Busca el establecimiento mas cercano
			break;
		case R.id.acercaDe:
			lanzarAcercaDe(null);
			break;
		case R.id.menu_mapa:
			Intent intent = new Intent(this, Mapa.class);
			startActivityForResult(intent, 0);
			return true;
		}
		return true;
	}

	@Override
	protected void onListItemClick(ListView listview, View vista, int posicion,
			long id) {
		super.onListItemClick(listview, vista, posicion, id);
		Intent i = new Intent(IniciaMaps.this, VistaLugar.class);
		i.putExtra("id", id);
		startActivityForResult(i, 0);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		//actualizaLista();
	}

	public void actualizaLista() {
		ListView listView = (ListView) findViewById(android.R.id.list);
		AdaptadorCursorLugares adaptador = (AdaptadorCursorLugares) listView
				.getAdapter();
		adaptador.changeCursor(Lugares.listado_ordenado());

	}
}
