package pfc.android.gestormensajeria.activities;

import pfc.android.gestormensajeria.R;
import pfc.android.gestormensajeria.dao.GestorMensajeriaDAO;
import pfc.android.gestormensajeria.dao.GestorMensajeriaDBAdapter;
import pfc.android.gestormensajeria.parametros.ParametrosNavegacion;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
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.view.View;
import android.widget.Toast;

/**
 * Activity de la pantalla principal desde la que accederemos a todas las funcionalidades que ofrece la aplicación. 
 * @author Francisco José Lamela Rincón
 *
 */
public class PrincipalActivity extends Activity {
	
	/**
	 * Propiedad de tipo LocationManager que usaremos para gestionar el uso del GPS
	 */
	private LocationManager milocManager = null;
	
	/**
	 * Propiedad de tipo LocationListener que usaremos para recibir los cambios en el GPS
	 */
	private LocationListener milocListener = null;

	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_principal);
		
		//Establecemos el comportamiento ante los eventos onclik en los botones que hemos definido en esta Activity
		establecerComportamientoBotones();
	}
	
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		
		//Comprobamos si se está volviendo de seleccionar una plantilla
		if(resultCode == ParametrosNavegacion.PLANTILLA_OK){
			//Obtenemos el cuerpo del mensaje de la plantilla
			Bundle b = data.getExtras();	
	        String contenidoPlantilla = b.getString(ParametrosNavegacion.CONTENIDO_PLANTILLA_SELECCIONADA);
	        
	        //Si no está vacío el cuerpo del mensaje 
	        if(contenidoPlantilla != null && contenidoPlantilla.length() > 0){
	        	//Muestra las aplicaciones disponibles para la redacción del mensaje pasandole el cuerpo del mensaje
	        	lanzarDialogoDeSeleccionParaSMS(contenidoPlantilla);
	        }

		}
	}
	
	
	// ***********************  METODOS AUXILIARES  ***********************
	
	/**
	 * Establece el comportamiento ante los eventos onclik en los botones que hemos definido en esta Activity
	 */
	private void establecerComportamientoBotones(){
		//Establecemos el comportamiento al pulsar sobre el boton de busquedas
		final View cvBusquedas = findViewById(R.id.btnBusquedas);
		cvBusquedas.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				//Creamos el Intent
                Intent intent = new Intent(PrincipalActivity.this, BusquedaActivity.class);
                //Iniciamos la nueva actividad
                startActivity(intent);
				
			}
		});
		
		//Establecemos el comportamiento al pulsar sobre el boton de configuracion
		final View cvConfiguracion = findViewById(R.id.btnConfiguracion);
		cvConfiguracion.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				//Creamos el Intent
                Intent intent = new Intent(PrincipalActivity.this, ConfiguracionActivity.class);
                //Iniciamos la nueva actividad
                startActivity(intent);
				
			}
		});
		
		//Establecemos el comportamiento al pulsar sobre el boton de nuevoSMS
		final View cvSMS = findViewById(R.id.btnNuevoSMS);
		cvSMS.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				lanzarNuevoMensajeIndividual();
			}
		});
		
		//Establecemos el comportamiento al pulsar sobre el boton de nuevo mensaje a grupo
		final View cvSMSGrupo = findViewById(R.id.btnNuevoSMSGrupo);
		cvSMSGrupo.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				//Creamos el Intent
                Intent intent = new Intent(PrincipalActivity.this, MensajeGrupoActivity.class);
                //Iniciamos la nueva actividad
                startActivity(intent);
				
			}
		});		
		
		//Establecemos el comportamiento al pulsar sobre el boton de gestion de plantillas
		final View cvPlantillas = findViewById(R.id.btnPlantillas);
		cvPlantillas.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				//Creamos el Intent
                Intent intent = new Intent(PrincipalActivity.this, PlantillasActivity.class);
                //Indicamos que estamos navegando para gestionar y no para usar
                Bundle b = new Bundle();
                b.putBoolean(ParametrosNavegacion.HABILITAR_USAR_PLANTILLA, false);
                intent.putExtras(b);
                //Iniciamos la nueva actividad
                startActivity(intent);
				
			}
		});
		
		//Establecemos el comportamiento al pulsar sobre el boton de busquedas
		final View cvAlerta = findViewById(R.id.btnMensajeAlerta);
		cvAlerta.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				//Obtenemos el servicio y lo asignamos
				milocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

				//Lo primero que miramos es si esta el GPS activo para intentar incluir las coordenadas y si no es asi mandamos el SMS sin coordenadas
				if(milocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
					//El GPS esta activo, asi que esperamos a tener coordenadas para enviar el mensaje
					milocListener = new MiLocationListener();
					//Lanzamos una peticion de localización y esperamos a que llegue
					milocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, milocListener);
				}else
					enviarMensajeAlerta(null);
			}
		});
		
	}
	
	
	/**
	 * Pregunta si se quiere usar una plantilla en la redacción del mensaje. Si se acepta navega a la pantalla de gestión de plantillas, si no, muestra 
	 * las aplicaciones disponibles para la redacción del mensaje.
	 */
	private void lanzarNuevoMensajeIndividual() {
		//Creamos el dialog para preguntar si se desea usar una plantilla
        AlertDialog.Builder dialogEliminar = new AlertDialog.Builder(this);
        dialogEliminar.setIcon(android.R.drawable.ic_dialog_alert);
        dialogEliminar.setTitle(getResources().getString(R.string.toast_titulo_usar_plantilla));
        dialogEliminar.setMessage(getResources().getString(R.string.toast_mensaje_usar_plantilla));
        dialogEliminar.setCancelable(false);
       
        //Establecemos el comportamiento cuando se responde afirmativamente
        dialogEliminar.setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
	        public void onClick(DialogInterface dialog, int boton) {
	        	//Lanzamos la pantalla de seleccion y gestion de plantillas
                Intent intent = new Intent(PrincipalActivity.this, PlantillasActivity.class);
                //Indicamos que estamos navegando para seleccionar una plantilla
                Bundle b = new Bundle();
                b.putBoolean(ParametrosNavegacion.HABILITAR_USAR_PLANTILLA, true);
                intent.putExtras(b);
                //Iniciamos la nueva actividad
                startActivityForResult(intent, ParametrosNavegacion.PLANTILLA_OK);
	        }

        });
	       
        //Establecemos el comportamiento cuando se responde negativamente
        dialogEliminar.setNegativeButton(android.R.string.no,  new DialogInterface.OnClickListener() {
	        public void onClick(DialogInterface dialog, int boton) {
	        	//Muestra las aplicaciones disponibles para la redacción del mensaje
	        	lanzarDialogoDeSeleccionParaSMS(null);
	        }

        });
       
        //Mostramos el dialog
        dialogEliminar.show();	
		
	}
	
	
	/**
	 * Muestra las aplicaciones disponibles para la redacción del mensaje
	 * @param mensaje Si no es nulo se pasa para que sea usado como cuerpo del mensaje
	 */
	private void lanzarDialogoDeSeleccionParaSMS(String mensaje){
		//Creamos el nuevo Intent que nos lleva a la redacción de SMS
		Intent smsIntent = new Intent();	        
		smsIntent.setAction(Intent.ACTION_VIEW);
		smsIntent.setType("vnd.android-dir/mms-sms");
		
		//Si nos pasan un mensaje lo incluimos
		if(mensaje != null)
			smsIntent.putExtra("sms_body", mensaje);
			
		//Lanzamos la activity
		startActivity(smsIntent);
	}


	/**
	 * Genera y envía un SMS de alerta
	 * @param loc Si no es nulo lo utiliza para incluir las coordenadas geográficas en el SMS
	 */
	protected void enviarMensajeAlerta(Location loc){
		//Obtenemos el mensaje de alerta definida en los parámetros de configuración
		String mensaje = obtenerMensajeDeAlertaDesdeConfiguracion();
		
		//Si el mensaje obtenido no es correcto se usa uno definido por defecto
		if(mensaje == null)
			mensaje = getString(R.string.sms_alerta_mensaje);
		
		mensaje += ". ";
		
		//Si la localización que recibe el método no es nula la usamos para obtener la posición geográfica e incluirla en el mensaje
		if(loc != null){
			loc.getLatitude();
			loc.getLongitude();
			
			mensaje += getString(R.string.sms_alerta_mensaje_coordenadas) + "Lat=" + loc.getLatitude() + ", Lon=" + loc.getLongitude();
			
			//Desactivamos la escucha de cambios en el GPS una vez que ya hemos obtenido las coordenadas
			milocManager.removeUpdates(milocListener);
		}
		
		//Enviamos el mensaje comprobando que todo se haya realizado correctamente e informando del resultado
		if(generarSMSAlertaYEnviar(mensaje))
			Toast.makeText( getApplicationContext(),getString(R.string.sms_alerta_mensaje_confirmacion) + mensaje,Toast.LENGTH_LONG).show();
		else
			Toast.makeText( getApplicationContext(),getString(R.string.sms_alerta_mensaje_no_eviado),Toast.LENGTH_LONG).show();
	}
	
	
	/**
	 * Obtiene el mensaje de alerta definida en los parámetros de configuración
	 * @return
	 */
	private String obtenerMensajeDeAlertaDesdeConfiguracion() {
		return GestorMensajeriaDAO.obtenerValorParametroConfiguracion(this, GestorMensajeriaDBAdapter.CODIGO_MENSAJE_ALERTA);
	}


	/**
	 * Generac un SMS de alerta con el mensaje pasado como parametro y lo envia al destinatario definido en los parámetros de configuración
	 * @param mensaje
	 * @return
	 */
	private boolean generarSMSAlertaYEnviar(String mensaje) {
		boolean enviado = true;
		
		//Obtenemos el número destino del SMS
		String numero = GestorMensajeriaDAO.obtenerValorParametroConfiguracion(this, GestorMensajeriaDBAdapter.CODIGO_CONTACTO_ALERTA);
		if(numero == null)
			enviado = false;
		else{
			GestorMensajeriaDAO.enviarSMS(numero, mensaje);
		}
		
		
		return enviado;
	}

	
	
	// ***********************  CLASES E INTERFACES INTERNAS  *********************** 
	
	/**
	 * Clase interna para manejar el comportamiento del listener del GPS
	 * @author Francisco José Lamela Rincón
	 *
	 */
	protected class MiLocationListener implements LocationListener{
		public void onLocationChanged(Location loc){
			enviarMensajeAlerta(loc);
		}
		
		public void onProviderDisabled(String provider){
			Toast.makeText( getApplicationContext(),getString(R.string.toast_gps_inactivo),Toast.LENGTH_SHORT ).show();
		}
		
		public void onProviderEnabled(String provider){
			Toast.makeText( getApplicationContext(),getString(R.string.toast_gps_activo),Toast.LENGTH_SHORT ).show();
		}
		
		public void onStatusChanged(String provider, int status, Bundle extras){}
	}

}
