package com.ramos.munoz.tesis;

import android.app.AlertDialog;
import android.app.NotificationManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.text.Html;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapaActivity extends FragmentActivity implements OnClickListener {

    public final static int CERRAR_SESION = 1;
    public static final int RESPUESTA_RADIO = 10;

    private static Mapa mapa = null;
    private Boolean vistasIncluidas = false;
    private static Estacionamiento est;
    private static Boolean tutorial = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	if (Usuario.getDatos() == null) {
	    LoginAsincrono loginTask = new LoginAsincrono();
	    loginTask.execute();
	    if (tutorial) {
		Intent i = new Intent(this, Tutorial.class);
		startActivity(i);
		tutorial = false;
	    }
	}
	Log.d("OnCreate", "inicio");
	setContentView(R.layout.mapa_activity);
	inicializarComponentes();
	mapa = new Mapa(this);
	inicializarMapa();
	if (!mapa.estaGPSActivado()) {
	    mostrarMensajeActivarGPS();
	}
	if (getIntent().hasExtra("longitud")) {
	    LatLng loc = new LatLng(getIntent().getDoubleExtra("latitud", 0), getIntent().getDoubleExtra("longitud", 0));
	    irALocalidad(loc);
	}

    }

    private void irALocalidad(LatLng loc) {

	int id = getIntent().getIntExtra("id", 0);
	MapaActivity.getMapa().animarCamara(loc);
	MapaActivity.getMapa();
	if (MapaActivity.getMapa().getEstacionamientosVisibles().containsKey(id)) {
	    MapaActivity.getMapa().getEstacionamientosVisibles().get(id).showInfoWindow();
	} else {
	    MarkerOptions marcador = new MarkerOptions();
	    marcador.position(loc);
	    marcador.title(est.getNombre());
	    marcador.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_estacionamiento_down));
	    marcador.snippet(est.getNombre() + ";" + est.getDisponibilidad() + ";" + est.getFechaEdicion() + ";" + est.getId());

	    MapaActivity.getMapa().getEstacionamientosVisibles().put(est.getId(), MapaActivity.getMapa().addMarker(est.getMarcador()));

	    MapaActivity.getMapa().getEstacionamientosVisibles().get(est.getId()).showInfoWindow();
	}

    }

    @Override
    protected void onDestroy() {
	super.onDestroy();

    }

    @Override
    public void onPause() {
	mapa.removerCambios();
	super.onPause();
    }

    @Override
    public void onResume() {
	super.onResume();
	Log.d("onResume", "INICIO");
	mapa.activarCambios();
    }

    private void inicializarComponentes() {
	ImageButton help = (ImageButton) findViewById(R.id.btnHelp);
	ImageButton botonMenu = (ImageButton) findViewById(R.id.btnOpciones);
	botonMenu.setOnClickListener(this);
	help.setOnClickListener(this);
    }

    private void inicializarMapa() {
	Log.d("MAPA", mapa.toString());
	if (mapa != null) {
	    Log.d("MAPA", "GETMAPA");
	    mapa.getMapa();
	}
    }

    public void onLocationChanged(Location arg0) {
    }

    private void mostrarMensajeActivarGPS() {
	AlertDialog.Builder mensaje = new AlertDialog.Builder(this);
	CharSequence titulo;
	if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
	    titulo = Html.fromHtml("<font color='#000'><b>" + getString(R.string.activarGPS) + "</b></font>");
	} else titulo = getString(R.string.activarGPS);
	mensaje.setTitle(titulo);
	mensaje.setMessage(getString(R.string.mensajeGPS));
	mensaje.setPositiveButton(getString(R.string.configuracion), new DialogInterface.OnClickListener() {
	    public void onClick(DialogInterface dialog, int which) {
		// TODO Auto-generated method stub
		Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
		startActivity(intent);
	    }
	});
	mensaje.setNegativeButton(getString(R.string.cancelar), new DialogInterface.OnClickListener() {
	    public void onClick(DialogInterface dialog, int which) {
		dialog.cancel();
	    }
	});
	mensaje.show();
    }

    private void mostrarMenu() {
	try {
	    Intent ventana = new Intent(this, MenuPrincipalActivity.class);
	    startActivityForResult(ventana, CERRAR_SESION);
	} catch (Exception e) {
	    e.printStackTrace();
	    Log.d("MostrarMenu Error", e.getMessage());

	}
    }

    public void onClick(View v) {
	switch (v.getId()) {
	    case R.id.btnOpciones:
		v.setSelected(!v.isSelected());
		mostrarMenu();
		break;
	    case R.id.btnHelp:
		Intent i = new Intent(this, Tutorial.class);
		startActivity(i);
		break;
	}
    }

    @Override
    public boolean onKeyDown(int k, KeyEvent event) {
	switch (k) {
	    case KeyEvent.KEYCODE_MENU:
		mostrarMenu();
		break;
	    case KeyEvent.KEYCODE_BACK:
		AlertDialog.Builder salir = new AlertDialog.Builder(this);
		CharSequence titulo = "";
		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
		    titulo = Html.fromHtml("<font color='#000'><b>" + getString(R.string.salir) + "</b></font>");
		} else titulo = getString(R.string.salir);
		salir.setTitle(titulo);
		salir.setMessage(getString(R.string.msgeSalir));
		salir.setPositiveButton(getString(R.string.salir), new DialogInterface.OnClickListener() {
		    public void onClick(DialogInterface dialog, int which) {
			finish();
		    }
		});
		salir.setNegativeButton(getString(R.string.cancelar), new DialogInterface.OnClickListener() {
		    public void onClick(DialogInterface dialog, int which) {
			dialog.cancel();
		    }
		});
		salir.show();
		break;
	    default:
		return false;
	}
	return true;
    }

    public static Mapa getMapa() {
	return mapa;
    }

    public static Marker addMarker(MarkerOptions options) {
	return mapa.addMarker(options);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	if (requestCode == CERRAR_SESION) {
	    if (resultCode == CERRAR_SESION) {
		cerrarSesion();
	    }
	}
	if (requestCode == RESPUESTA_RADIO) {
	    if (resultCode == RESPUESTA_RADIO) {
		dibujarRadio(data);
	    }
	}
    }

    private void dibujarRadio(Intent data) {

	if (mapa.getMostrandoRuta()) {
	    mapa.removerRuta();
	}
	if (mapa.isMostrandoCirculo()) {
	    mapa.removerCirulo();
	}
	if (mapa.isVistasIncluidas()) {
	    mapa.removerVistas();
	}

	int radio = data.getIntExtra("radio", 0);
	LatLng centro = new LatLng(mapa.getLatitudPunto(), mapa.getLongitudPunto());
	CircleOptions circulo = new CircleOptions();
	circulo.center(centro);
	circulo.strokeColor(0xFFFFA420);
	circulo.strokeWidth(2f);
	circulo.fillColor(0x11FFA420);
	circulo.radius(radio);

	mapa.agregarCirculo(circulo);

	final FrameLayout fl = (FrameLayout) findViewById(R.id.flMapaActivity);
	LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	View v = layoutInflater.inflate(R.layout.mapa_mensaje_dibujo_plantilla, null, false);
	TextView txtMensaje = (TextView) v.findViewById(R.id.txtMensaje);
	ImageButton btnX = (ImageButton) v.findViewById(R.id.btnCerrar);
	String msge = getString(R.string.msgeBuscarRadio);
	msge = String.format(msge, radio);
	txtMensaje.setText(msge);
	fl.addView(v, 1);

	mapa.setMostrandoCirculo(true);
	mapa.setVistasIncluidas(true);

	btnX.setOnClickListener(new OnClickListener() {

	    public void onClick(View v) {
		mapa.removerCirulo();
		mapa.removerVistas();
	    }
	});
    }

    public static Estacionamiento getEst() {
	return est;
    }

    public static void setEst(Estacionamiento est) {
	MapaActivity.est = est;
    }

    private void cerrarSesion() {
	Toast salir = Toast.makeText(this, getString(R.string.msgeSaliendo), Toast.LENGTH_SHORT);
	salir.show();
	Intent ventanaLogin = new Intent(this, LauncherActivity.class);
	startActivity(ventanaLogin);
	if (NotificacionServicio.getMostrandoNotificacion()) {
	    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
	    notificationManager.cancel(0);
	    NotificacionServicio.setMostrandoNotificacion(false);
	}
	Intent servicio = new Intent(this, NotificacionServicio.class);
	stopService(servicio);
	finish();

    }

    class LoginAsincrono extends AsyncTask<String, Integer, Boolean> {
	private ProgressDialog barraEstado;

	@Override
	protected Boolean doInBackground(String... params) {
	    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
	    String usuario = prefs.getString("editUsuario", "");
	    String pass = prefs.getString("editPassword", "");

	    Usuario usuarioMovil = new Usuario();
	    String respuesta = usuarioMovil.ingresar(usuario, pass);
	    if (respuesta == "bien") {

		return true;

	    } else {
		return false;
	    }
	}

	@Override
	protected void onPostExecute(Boolean resp) {
	    super.onPostExecute(resp);
	}

	@Override
	protected void onPreExecute() {
	    super.onPreExecute();
	}
    }

}
