package pfc.android.gestormensajeria.activities;

import pfc.android.gestormensajeria.R;
import pfc.android.gestormensajeria.dao.GestorMensajeriaDAO;
import pfc.android.gestormensajeria.entidades.ComponenteGrupo;
import pfc.android.gestormensajeria.entidades.Grupo;
import pfc.android.gestormensajeria.parametros.ParametrosNavegacion;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

/**
 * Activity para la redacción de un mensaje SMS dirigido a un grupo de destinatarios. En ella se podrá seleccionar el grupo destino del mensaje y 
 * redactar el contenido del mensaje, teniendo la posibilidad de cargar una plantilla de mensaje predefinida.
 * @author Francisco José Lamela Rincón
 *
 */
public class MensajeGrupoActivity extends Activity {

	/**
	 * Propiedad de tipo Grupo que servira para manejar el grupo de contactos destinatarios del mensaje
	 */
	private Grupo grupoDestinatarios = null;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_mensaje_grupo);
		
		//Establecemos el comportamiento ante el evento onclik de los botones
		establecerComportamientoBotones();
		
	}

	

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		
		if(resultCode == ParametrosNavegacion.GRUPO_OK){
			Bundle b = data.getExtras();	
	        String nombreGrupo = b != null ? b.getString(ParametrosNavegacion.GRUPO_DESTINATARIOS) : null;
	        if(nombreGrupo != null && nombreGrupo.length() > 0){
				grupoDestinatarios = GestorMensajeriaDAO.getGrupoPorNombre(this, nombreGrupo);
				if(grupoDestinatarios != null){
					//Indicamos el nombre del grupo
					EditText editNombreGrupo = (EditText)findViewById(R.id.editNombreGrupoEdicion);
					editNombreGrupo.setText(grupoDestinatarios.getNombre());
				}else{
					//Limpiamos el nombre del grupo
					EditText editNombreGrupo = (EditText)findViewById(R.id.editNombreGrupoEdicion);
					editNombreGrupo.getText().clear();
				}
				
	        }
	        
		}else if(resultCode == ParametrosNavegacion.PLANTILLA_OK){
			Bundle b = data.getExtras();	
	        String contenidoPlantilla = b != null ? b.getString(ParametrosNavegacion.CONTENIDO_PLANTILLA_SELECCIONADA) : null;
	        if(contenidoPlantilla != null && contenidoPlantilla.length() > 0){
				EditText editCuerpoMensaje = (EditText)findViewById(R.id.editCuerpoMensaje);
				editCuerpoMensaje.setText(contenidoPlantilla);
	        }
	        
		}
	}
	
	
	// ***********************  METODOS AUXILIARES  ***********************
	
	/**
	 * Establecemos el comportamiento ante el evento onclik de los botones
	 */
	private void establecerComportamientoBotones() {
		//Establecemos el comportamiento al pulsar sobre el boton de busqueda de grupo
		final View cvBusquedaGrupo = findViewById(R.id.btnIncluirGrupo);
		cvBusquedaGrupo.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				//Creamos el Intent
                Intent intent = new Intent(MensajeGrupoActivity.this, GruposActivity.class);
                //Iniciamos la nueva actividad
                startActivityForResult(intent, ParametrosNavegacion.GRUPO_OK);
				
			}
		});
		
		
		//Establecemos el comportamiento al pulsar sobre el boton de busqueda de plantillas
		final View cvBusquedaPlantilla = findViewById(R.id.btnIncluirPlantilla);
		cvBusquedaPlantilla.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				//Creamos el Intent
                Intent intent = new Intent(MensajeGrupoActivity.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 al pulsar sobre el boton de limpiar
		final View cvLimpiar = findViewById(R.id.btnLimpiar);
		cvLimpiar.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				EditText editContenidoMensaje = (EditText)findViewById(R.id.editCuerpoMensaje);
				editContenidoMensaje.getText().clear();
			}
		});
		
		//Establecemos el comportamiento al pulsar sobre el boton de limpiar
		final View cvEnviar = findViewById(R.id.btnEnviarMensaje);
		cvEnviar.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				enviarMensajeAGrupo();
			}
		});
	}
	
	
	/**
	 * Tras hacer las comprobaciones necesarias envía un SMS con el mensaje a cada uno de los destinatarios que componen el grupo seleccionado
	 */
	private void enviarMensajeAGrupo(){
		//Comprobamos en primer lugar que se haya seleccionado un grupo válido
		if(grupoDestinatarios == null || grupoDestinatarios.getDestinatarios() == null || grupoDestinatarios.getDestinatarios().size() == 0){
			Toast.makeText(getApplicationContext(),getString(R.string.toast_sms_grupo_error_grupo_no_valido),Toast.LENGTH_LONG).show();
		}else{
			//Obtenemos el texto del mensaje
			EditText editCuerpoMensaje = (EditText)findViewById(R.id.editCuerpoMensaje);
			String mensaje = editCuerpoMensaje.getText().toString();
			
			//Comprobamos que sea un mensaje válido
			if(mensaje == null || mensaje.length() == 0)
				Toast.makeText(getApplicationContext(),getString(R.string.toast_sms_grupo_error_mensaje_no_valido),Toast.LENGTH_LONG).show();
			else{
				//Tanto grupo como mensaje son válidos asi que procedemos a enviar el mensaje
				//Como implica varios mensajes, uno por cada destinatario, vamos a pedir confirmacion antes de enviar
				//evitando así que se envíen al pulsar el botón por error
		        AlertDialog.Builder dialogEliminar = new AlertDialog.Builder(this);
		        dialogEliminar.setIcon(android.R.drawable.ic_dialog_alert);
		        dialogEliminar.setTitle(getResources().getString(R.string.toast_titulo_confirmacion_enviar_mensaje_grupo));
		        dialogEliminar.setMessage(getResources().getString(R.string.toast_mensaje_confirmacion_enviar_mensaje_grupo));
		        dialogEliminar.setCancelable(false);
		       
		        //Establece el comportamiento cuando se responde afirmativamente
		        dialogEliminar.setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
		        	public void onClick(DialogInterface dialog, int boton) {
		        		//Recorremos los destinatarios en el grupo y enviamo un SMS por cada uno de ellos
		        		for(ComponenteGrupo cg: grupoDestinatarios.getDestinatarios()){
		        			//Obtenemos el número del destinatario
		        			String numero = GestorMensajeriaDAO.obtenerNumeroDeContactoPorId(MensajeGrupoActivity.this, cg.getIdDestinatario());
		        			if(numero != null){
		        				//Obtenemos el texto del mensaje
		        				EditText editCuerpoMensaje = (EditText)findViewById(R.id.editCuerpoMensaje);
		        				String mensaje = editCuerpoMensaje.getText().toString();
		        				
		        				//Enviamos el mensaje
		        				GestorMensajeriaDAO.enviarSMS(numero, mensaje);
		        			}
		        		}
		        		
		        		//Informamos al usuario de la finalizacion del procesos
			        	Toast.makeText(getApplicationContext(), R.string.toast_confirmacion_mensaje_grupo_enviado, Toast.LENGTH_SHORT).show();
			            
			        	//Limpiamos los campos e inicializamos propiedades
			        	EditText editNombreGrupo = (EditText)findViewById(R.id.editNombreGrupoEdicion);
			        	editNombreGrupo.getText().clear();
			        	grupoDestinatarios = null;
						
						EditText editCuerpoMensaje = (EditText)findViewById(R.id.editCuerpoMensaje);
						editCuerpoMensaje.getText().clear();
		        	}

		        });

		        //Establece el comportamiento cuando se responde negativamente
		        dialogEliminar.setNegativeButton(android.R.string.no, null);
		       
		        //Muestra el diálogo
		        dialogEliminar.show();	
			}
		}
	}
}
