package com.example.fideliza;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.RatingBar.OnRatingBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class VistaLugar extends Activity {

	private long id;
	private Lugar lugar;
	private ImageView imageView;
	final static int RESULTADO_EDITAR = 1;
	final static int RESULTADO_GALERIA = 2;
	final static int RESULTADO_FOTO = 3;
	private Uri uriFoto;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.vista_lugar);
		Bundle extras = getIntent().getExtras();
		id = extras.getLong("id", -1);

		imageView = (ImageView) findViewById(R.id.foto);
		actualizarVistas();

	}

	private void actualizarVistas() {
		// **** Acutaliza las vistas despues de modificar valores ***
		lugar = Lugares.elemento((int) id);
		TextView nombre = (TextView) findViewById(R.id.nombre);
		nombre.setText(lugar.getNombre());
		ImageView logo_tipo = (ImageView) findViewById(R.id.logo_tipo);
		logo_tipo.setImageResource(lugar.getTipo().getRecurso());
		TextView tipo = (TextView) findViewById(R.id.tipo);
		tipo.setText(lugar.getTipo().getTexto());
		if (lugar.getDireccion() == "") {
			findViewById(R.id.p_direccion).setVisibility(View.GONE);
			findViewById(R.id.direccion).setVisibility(View.GONE);
		} else {
			TextView direccion = (TextView) findViewById(R.id.direccion);
			direccion.setText(lugar.getDireccion());
		}
		if (lugar.getTelefono() == 0) {
			findViewById(R.id.p_telefono).setVisibility(View.GONE);
			findViewById(R.id.telefono).setVisibility(View.GONE);
		} else {
			TextView telefono = (TextView) findViewById(R.id.telefono);
			telefono.setText(Integer.toString(lugar.getTelefono()));
		}
		if (lugar.getUrl() == "") {
			findViewById(R.id.p_url).setVisibility(View.GONE);
			findViewById(R.id.url).setVisibility(View.GONE);
		} else {
			TextView url = (TextView) findViewById(R.id.url);
			url.setText(lugar.getUrl());
		}
		if (lugar.getComentario() == "") {
			findViewById(R.id.p_comentario).setVisibility(View.GONE);
			findViewById(R.id.comentario).setVisibility(View.GONE);
		} else {
			TextView comentario = (TextView) findViewById(R.id.comentario);
			comentario.setText(lugar.getComentario());
		}
		TextView fecha = (TextView) findViewById(R.id.fecha);
		fecha.setText(DateFormat.getDateInstance().format(
				new Date(lugar.getFecha())));
		TextView hora = (TextView) findViewById(R.id.hora);
		hora.setText(DateFormat.getTimeInstance().format(
				new Date(lugar.getFecha())));
		RatingBar valoracion = (RatingBar) findViewById(R.id.valoracion);
		valoracion.setRating(lugar.getValoracion());
		valoracion
				.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
					@Override
					public void onRatingChanged(RatingBar ratingBar,
							float valor, boolean fromUser) {
						lugar.setValoracion(valor);
						Lugares.actualizaLugar((int) id, lugar);
					}

				});
		ponerFoto(imageView, lugar.getFoto());

	}

	public void confirmarBorrado(View view) {
		new AlertDialog.Builder(this)
				.setTitle("Borrado de lugar")
				.setMessage("¿Estas seguro que quieres eliminar este lugar?")
				.setPositiveButton("Confirmar",
						new DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface dialog,
									int whichButton) {
								Lugares.borrar((int) id);
								finish();
							}
						}).setNegativeButton("Cancelar", null).show();
	}

	public void eliminarFoto(View view) {
		lugar.setFoto(null);
		ponerFoto(imageView, null);
		Lugares.actualizaLugar((int) id, lugar);
	}

	public void tomarFoto(View view) {
		Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
		uriFoto = Uri.fromFile(new File(Environment
				.getExternalStorageDirectory()
				+ File.separator
				+ "img_"
				+ (System.currentTimeMillis() / 1000) + ".jpg"));
		intent.putExtra(MediaStore.EXTRA_OUTPUT, uriFoto);
		startActivityForResult(intent, RESULTADO_FOTO);
	}

	public void galeria(View view) {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.addCategory(Intent.CATEGORY_OPENABLE);
		intent.setType("image/*");
		startActivityForResult(intent, RESULTADO_GALERIA);
	}

	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == RESULTADO_EDITAR) {
			actualizarVistas();
			findViewById(R.id.scrollView1).invalidate(); // scrollView1 es el
															// scroll que
															// contiene todo el
															// layout
		} else if (requestCode == RESULTADO_GALERIA
				&& resultCode == Activity.RESULT_OK) {
			lugar.setFoto(data.getDataString());
			Lugares.actualizaLugar((int) id, lugar);
			ponerFoto(imageView, lugar.getFoto());
		} else if (requestCode == RESULTADO_FOTO
				&& resultCode == Activity.RESULT_OK && lugar != null
				&& uriFoto != null) {
			lugar.setFoto(uriFoto.toString());
			Lugares.actualizaLugar((int) id, lugar);
			ponerFoto(imageView, lugar.getFoto());
		}
	}

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

	public void verMapa(View view) {
		Uri uri;
		double lat = lugar.getPosicion().getLatitud();
		double lon = lugar.getPosicion().getLongitud();
		if (lat != 0 || lon != 0) {
			uri = Uri.parse("geo:" + lat + "," + lon + "?q=("
					+ lugar.getNombre() + ")@" + lat + "," + lon);
		} else {
			uri = Uri.parse("geo:0,0?q=" + lugar.getDireccion());
		}
		Intent intent = new Intent(Intent.ACTION_VIEW, uri);
		startActivity(intent);
	}

	public void llamadaTelefono(View view) {
		if (lugar.getTelefono() > 0)
			startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"
					+ lugar.getTelefono())));
	}

	public void pgWeb(View view) {
		if ((lugar.getUrl() != null) && (!lugar.getUrl().equals("")))
			startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(lugar
					.getUrl())));
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.accion_compartir:
			Intent intent = new Intent(Intent.ACTION_SEND);
			intent.setType("text/plain");
			intent.putExtra(Intent.EXTRA_TEXT, lugar.getNombre() + " - "
					+ lugar.getUrl());
			startActivity(intent);
			return true;
		case R.id.accion_llegar:
			verMapa(null);
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	protected void ponerFoto(ImageView imageView, String uri) {
			
		if (uri != null) {
			imageView.setImageBitmap(reduceBitmapURL(this, uri, 1024, 1024));
		} else {
			imageView.setImageBitmap(null);
		}
		
	}

	public static InputStream obtenInputStream(Context contexto, String uri)
			throws MalformedURLException, IOException {
		if (uri.startsWith("http://")) {
			StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
					.permitNetwork().build());
			return new URL(uri).openStream();
		} else {
			return contexto.getContentResolver()
					.openInputStream(Uri.parse(uri));
		}
	}

	public static Bitmap reduceBitmapURL(Context contexto, String uri,
			int maxAncho, int maxAlto) {
		try {
			final BitmapFactory.Options options = new BitmapFactory.Options();
			options.inJustDecodeBounds = true;
			BitmapFactory.decodeStream(obtenInputStream(contexto, uri), null,
					options);
			options.inSampleSize = Math.max(options.outWidth / maxAncho,
					options.outHeight / maxAlto);
			options.inJustDecodeBounds = false;
			return BitmapFactory.decodeStream(obtenInputStream(contexto, uri), null,
					options);
		} catch (IOException e) {
			Toast.makeText(contexto, "Fichero/recurso no encontrado",
					Toast.LENGTH_LONG).show();
			e.printStackTrace();
			return null;
		}

	}
}
