package com.ramos.munoz.tesis;

import java.util.ArrayList;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
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 BuscarEstacionamientoResultadoActivity extends Activity {

    private LinearLayout llContenedor;
    private static int offset;
    private final int LIMITE = 10;
    private int precio;
    private int valoracion;
    private int cercania;
    private int disponibilidad;
    private String servicio;
    private String nombre;
    private ArrayList<Estacionamiento> estacionamientos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.buscar_estacionamiento_respuesta_activity);
	offset = 0;
	inicializarComponentes();
    }

    private void inicializarComponentes() {
	Intent intent = getIntent();
	precio = intent.getIntExtra("precio", 0);
	valoracion = intent.getIntExtra("valoracion", 0);
	cercania = intent.getIntExtra("cercania", 0);
	disponibilidad = intent.getIntExtra("disponibilidad", 0);
	nombre = intent.getStringExtra("nombre");
	servicio = intent.getStringExtra("servicio");
	llContenedor = (LinearLayout) findViewById(R.id.llContenedor);
	BuscarEstacionamientoTask buscarTask = new BuscarEstacionamientoTask();
	buscarTask.execute();
    }

    public void mostrarDatos() {
	if (estacionamientos.size() == 0) {
	    String txt = "No se han encotrado resultados que se ajusten a esta búsqueda.";
	    TextView msgeSinResultados = new TextView(this);
	    msgeSinResultados.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

	    msgeSinResultados.setText(txt);
	    llContenedor.addView(msgeSinResultados);

	} else {
	    for (final Estacionamiento e : estacionamientos) {

		View llFila = getLayoutInflater().inflate(R.layout.buscar_estacionamiento_respuesta_fila, null);
		llFila.setId(e.getId());
		TextView txtNombre = (TextView) llFila.findViewById(R.id.txtNombre);
		TextView txtDisponibilidad = (TextView) llFila.findViewById(R.id.txtDisponibilidad);
		TextView txtDistancia = (TextView) llFila.findViewById(R.id.txtDistancia);
		TextView txtActualizado = (TextView) llFila.findViewById(R.id.txtActualizado);
		TextView txtValoracion = (TextView) llFila.findViewById(R.id.txtValoracion);
		TextView txtServicio = (TextView) llFila.findViewById(R.id.txtServicio);
		ImageView imgDisponibilidad = (ImageView) llFila.findViewById(R.id.imgDisponibilidad);
		TextView precioPorHora = (TextView) llFila.findViewById(R.id.txtPrecioPorHora);
		ImageButton ir = (ImageButton) llFila.findViewById(R.id.btnIrAEstacionamiento);
		ImageButton detalle = (ImageButton) llFila.findViewById(R.id.btnDetalleEstacionamiento);

		txtNombre.setText(e.getNombre());
		txtDistancia.setText("Distancia: " + e.getDistancia() + " mts.");
		txtActualizado.setText("Actualizado el: " + e.getFechaEdicion());
		txtValoracion.setText(getString(R.string.calificacion) + String.valueOf(e.getPromedioValoracion()));
		txtServicio.setText("Servicio: " + (e.getServicio().equals("null") ? "No especificados." : e.getServicio()));
		precioPorHora.setText(getString(R.string.hora) + (e.getPrecioPorHora().equals("null") ? "No especificado" : e.getPrecioPorHora()));
		txtDisponibilidad.setText(getString(R.string.disponibilidad));
		if (e.getDisponibilidad().equals("Si")) {
		    imgDisponibilidad.setImageDrawable(getResources().getDrawable(R.drawable.ic_disponibilidad));
		} else {
		    imgDisponibilidad.setImageDrawable(getResources().getDrawable(R.drawable.ic_disponibilidad_no));

		}

		detalle.setOnClickListener(new OnClickListener() {

		    @Override
		    public void onClick(View v) {
			Intent detalle = new Intent(BuscarEstacionamientoResultadoActivity.this, MapaDetalleEstacionamiento.class);
			detalle.putExtra("id", e.getId());
			startActivity(detalle);
		    }
		});

		ir.setOnClickListener(new OnClickListener() {

		    public void onClick(View arg0) {

			LatLng loc = new LatLng(e.getLatitud(), e.getLongitud());
			MapaActivity.getMapa().animarCamara(loc);
			MapaActivity.getMapa();
			Estacionamiento est = MapaActivity.getMapa().getEstacionamiento(e.getId());

			if (MapaActivity.getMapa().getEstacionamientosVisibles().containsKey(e.getId())) {
			    MapaActivity.getMapa().getEstacionamientosVisibles().get(est.getId()).showInfoWindow();
			} else {
			    MarkerOptions marcador = new MarkerOptions();
			    marcador.position(new LatLng(e.getLatitud(), e.getLongitud()));
			    marcador.title(e.getNombre());
			    marcador.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_estacionamiento_down));
			    marcador.snippet(e.getNombre() + ";" + e.getDisponibilidad() + ";" + e.getFechaEdicion() + ";" + e.getId());

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

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

		    }
		});

		llContenedor.addView(llFila);
	    }
	}
    }

    public class BuscarEstacionamientoTask extends AsyncTask<Object, Integer, ArrayList<Estacionamiento>> {

	private ProgressDialog barraEstado;

	@Override
	protected ArrayList<Estacionamiento> doInBackground(Object... params) {
	    // nombre, servicio, disponibilidad, cercania, precio,
	    // valoracion
	    Location loc = MapaActivity.getMapa().getUltimaUbicacion();
	    Estacionamiento e = new Estacionamiento();
	    ArrayList<Estacionamiento> estacionamientos = e.buscarPorFiltros(loc, offset, LIMITE, nombre, servicio, disponibilidad, cercania, precio,
		    valoracion);
	    return estacionamientos;
	}

	@Override
	protected void onPostExecute(ArrayList<Estacionamiento> resp) {
	    estacionamientos = resp;
	    offset = offset + LIMITE;
	    mostrarDatos();
	    barraEstado.dismiss();
	}

	@Override
	protected void onPreExecute() {
	    barraEstado = new ProgressDialog(BuscarEstacionamientoResultadoActivity.this);
	    barraEstado.setProgressStyle(ProgressDialog.STYLE_SPINNER);
	    barraEstado.setMessage(getString(R.string.cargandoEstacionamientos));
	    barraEstado.show();
	    barraEstado.setCanceledOnTouchOutside(false);
	}
    }

}
