package pfc.android.gestormensajeria.activities;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import pfc.android.gestormensajeria.R;
import pfc.android.gestormensajeria.dao.GestorMensajeriaDAO;
import pfc.android.gestormensajeria.entidades.Plantilla;
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.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

/**
 * Activity para la gestión y uso de plantillas de mensajes que podrán ser usadas en la redacción de SMS
 * @author Francisco Joseé Lamela Rincón
 *
 */
public class PlantillasActivity extends Activity {
	
	/**
	 * Propiedad que usaremos para el control de la lista de plantillas que se muestra en la Activity
	 */
	private ListView lstPlantillas;
	
	/**
	 * Colección que usaremos para trabajar con las plantillas
	 */
	private Set<Plantilla> plantillas = null;

	/**
	 * Array que usaremos para trabajar con las plantillas
	 */
	private Plantilla[] arrayPlantillas = null;
	
	/**
	 * Array con los nombres de las plantillas que usaremos para montar la lista en pantalla
	 */
	private String[] nombresPlantillas = null;
	
	/**
	 * Propiedad de tipo Plantilla que usaremos para controlar la plantilla seleccionada en cada momento
	 */
	private Plantilla plantillaSeleccionada = null;
	
	/**
	 * Propiedad de tipo ArrayAdapter para controlar el adaptador usado para mostrar y gestionar la lista de plantillas mostrada en pantalla
	 */
	private ArrayAdapter<String> adapterPlantillas = null;

	/**
	 * Propiedad con la que indicaremos si se debe habilitar la opción de usar la plantilla
	 */
	private boolean habilitarUsar = false;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_plantillas);
		
		//Comprobamos si hemos llegado a esta pantalla para seleccionar una plantilla que quiere ser usada
		Bundle b = this.getIntent().getExtras();
        habilitarUsar = false;
        if(b != null && b.containsKey(ParametrosNavegacion.HABILITAR_USAR_PLANTILLA))
        	habilitarUsar = b.getBoolean(ParametrosNavegacion.HABILITAR_USAR_PLANTILLA);
		
		//Obtenemos las plantillas
		obtenerPlantillas(null);
		
		//Generamos las estructura de la lista para mostrarla en pantalla
		lstPlantillas = (ListView)findViewById(R.id.LstNombresPlantillas);
		adapterPlantillas = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,nombresPlantillas);
		lstPlantillas.setAdapter(adapterPlantillas);
		
		//Establecemos el comportamiento al seleccionar un elemento de la lista
        lstPlantillas.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> list, View view, int pos, long id) {
            	onPlantillaSeleccionada(arrayPlantillas[pos]);
            }
        });
       
        //Establecemos el comportamiento ante los eventos onclick en los distintos botones que se muestran en la pantalla
		asociarEventoClickABotones();      
	}
	
	
	
	// ***********************  METODOS AUXILIARES  ***********************
	
	/**
	 * Obtiene las plantillas que se van a mostrar por pantalla en la lista de plantillas 
	 * @param plantillasActualizadas Si no es nula, en vez de cargar las plantillas directamente desde base de datos, se actualizará la lista con las plantillas que contenga esta colección
	 * @return
	 */
	private boolean obtenerPlantillas(Set<Plantilla> plantillasActualizadas){
		boolean ok = false;
		
		//Si es nula cargamos desde base de datos
		if(plantillasActualizadas == null)
			plantillas = GestorMensajeriaDAO.getPlantillas(this);
		else{
			//Si no es nula actualizamos con las plantillas pasadas en la colección
			plantillas.clear();
			plantillas.addAll(plantillasActualizadas);
		}
			
		//Si se han encontrado plantillas actulizamos las colecciones que usamos para la gestión de las plantillas
		if(plantillas != null && plantillas.size() > 0){
			ok = true;
			arrayPlantillas = new Plantilla[plantillas.size()];
			nombresPlantillas = new String[plantillas.size()];
			Iterator<Plantilla> it = plantillas.iterator();
			int indice = 0;
			while(it.hasNext()){
				arrayPlantillas[indice] = it.next();
				nombresPlantillas[indice] = arrayPlantillas[indice].getNombre(); 
				indice++;
			}
		}else{
			arrayPlantillas = new Plantilla[0];
			nombresPlantillas = new String[0];
		}
		
		return ok;
	}

	
	/**
	 * Establece el comportamiento ante los eventos onclick en los distintos botones que se muestran en la pantalla
	 */
	private void asociarEventoClickABotones() {
		//Establecemos el comportamiento al pulsar sobre el boton de nueva plantilla
  		final View btnNuevaPlantilla = findViewById(R.id.btnNuevaPlantilla);
  		btnNuevaPlantilla.setOnClickListener(new View.OnClickListener() {
  			@Override
  			public void onClick(View view) {
  				habilitarParaNuevaPlantilla();
  			}
  		});
  		
        //Establecemos el comportamiento al pulsar sobre el boton de editar plantilla
  		final View btnEditarPlantilla = findViewById(R.id.btnEditarPlantilla);
  		btnEditarPlantilla.setOnClickListener(new View.OnClickListener() {
  			@Override
  			public void onClick(View view) {
  				habilitarParaEditarPlantilla();
  			}
  		});
  		
        //Establecemos el comportamiento al pulsar sobre el boton de borrar plantilla
  		final View btnBorrarPlantilla = findViewById(R.id.btnBorrarPlantilla);
  		btnBorrarPlantilla.setOnClickListener(new View.OnClickListener() {
  			@Override
  			public void onClick(View view) {
  				borrarPlantilla();
  			}
  		});
  		
        //Establecemos el comportamiento al pulsar sobre el boton de usar plantilla
  		final View btnUsarPlantilla = findViewById(R.id.btnUsarPlantilla);
  		btnUsarPlantilla.setOnClickListener(new View.OnClickListener() {
  			@Override
  			public void onClick(View view) {
  				if(habilitarUsar){
  	  				if(plantillaSeleccionada != null){
  	  					//Creamos el Intent
  	  	                Intent intent = new Intent();
  	  	                //Creamos la información a pasar entre actividades
  	  	                Bundle b = new Bundle();
  	  	                b.putString(ParametrosNavegacion.CONTENIDO_PLANTILLA_SELECCIONADA, plantillaSeleccionada.getContenido());
  	  	                //Añadimos la información al intent
  	  	                intent.putExtras(b);
  	  	                setResult(ParametrosNavegacion.PLANTILLA_OK, intent);

  	  	                //Reinicializamos la usabilidad del botón 
  	  	                habilitarUsar = false;
  	  	                
  	  	                //Cerramos para devolver el control a la activity desde la que se solicito seleccionar una plantilla
  	  	                finish();
  	  				}else
  	  					Toast.makeText(PlantillasActivity.this.getApplicationContext(), R.string.toast_error_usar_plantilla, Toast.LENGTH_LONG).show();  					
  				}
  			}
  		});
  		
  		//Establecemos el comportamiento al pulsar sobre el boton de gestion de nueva plantilla
  		final View btnGuardarPlantilla = findViewById(R.id.btnGuardarPlantilla);
  		btnGuardarPlantilla.setOnClickListener(new View.OnClickListener() {
  			@Override
  			public void onClick(View view) {
  				comprobarYguardarPlantilla();
  			}
  		});
	}
	
	 
	/**
	 * Carga el nombre y el contenido de la plantilla seleccionada en los campos de edición
	 * @param plantilla
	 */
	public void onPlantillaSeleccionada(Plantilla plantilla) {
		 EditText editNombrePlantilla = (EditText)findViewById(R.id.EditNombrePlantilla);
		 editNombrePlantilla.setText(plantilla.getNombre());
		 
		 EditText editCuerpoPlantilla = (EditText)findViewById(R.id.EditCuerpoPlantilla);
		 editCuerpoPlantilla.setText(plantilla.getContenido());
		 
		 plantillaSeleccionada = plantilla;
	}
	 
	
	/**
	 * Prepara los controles en la pantalla para poder intruducir los datos de una nueva plantilla
	 */
	private void habilitarParaNuevaPlantilla() {
		setEnabledCamposPlantilla(true);
		plantillaSeleccionada = null;
	}
	
	
	/**
	 * Habilita o deshabilita los campos para el nombre y el contenido de la plantilla en función del parametro enabled
	 * @param enabled
	 */
	private void setEnabledCamposPlantilla(boolean enabled) {
		EditText editNombrePlantilla = (EditText)findViewById(R.id.EditNombrePlantilla);
		EditText editCuerpoPlantilla = (EditText)findViewById(R.id.EditCuerpoPlantilla);
		
		editNombrePlantilla.getText().clear();
		editCuerpoPlantilla.getText().clear();
		
		editNombrePlantilla.setEnabled(enabled);
		editCuerpoPlantilla.setEnabled(enabled);
	}
	
	
	/**
	 * Prepara los controles en la pantalla para poder editar los datos de una plantilla
	 */
	private void habilitarParaEditarPlantilla() {
		if(plantillaSeleccionada != null){
			EditText editNombrePlantilla = (EditText)findViewById(R.id.EditNombrePlantilla);
			EditText editCuerpoPlantilla = (EditText)findViewById(R.id.EditCuerpoPlantilla);
			
			editNombrePlantilla.setText(plantillaSeleccionada.getNombre());
			editCuerpoPlantilla.setText(plantillaSeleccionada.getContenido());
			
			editCuerpoPlantilla.setEnabled(true);
		}
	}
	
	
	/**
	 * Comprueba que los valores introducidos para la plantillas son correctos y si es así guarda los cambios 
	 */
	private void comprobarYguardarPlantilla(){
		EditText editNombrePlantilla = (EditText)findViewById(R.id.EditNombrePlantilla);
		EditText editCuerpoPlantilla = (EditText)findViewById(R.id.EditCuerpoPlantilla);
		
		String nombre  = editNombrePlantilla.getText().toString();  
		String contenido = editCuerpoPlantilla.getText().toString();
		
		//Comprobamos que se haya indicado nombre y contenido y si el contenido no excede el número de caracteres
		//Si todo esta en orden creamos una nueva plantilla y la guardamos
		if(nombre != null && nombre.length() > 0 && contenido != null && contenido.length() > 0){
			if(contenido.length() <= 255){
				Plantilla plantilla = GestorMensajeriaDAO.guardarNuevaPlantilla(this, nombre, contenido);
				if(plantilla != null){
					//Actualizamos la lista de resultados
					Set<Plantilla> plantillasActualizadas = new HashSet<Plantilla>(plantillas);
					plantillasActualizadas.add(plantilla);
					obtenerPlantillas(plantillasActualizadas); 
					Toast.makeText(this.getApplicationContext(), R.string.toast_OK_guardar_plantilla, Toast.LENGTH_LONG).show();
					
					//Deshabilitamos los campos de edición
					setEnabledCamposPlantilla(false);
					limpiarSeleccion();
					
					adapterPlantillas = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,nombresPlantillas);
					lstPlantillas.setAdapter(adapterPlantillas);

				}else
					Toast.makeText(this.getApplicationContext(), R.string.toast_error_guardar_plantilla, Toast.LENGTH_LONG).show();
			}else
				Toast.makeText(this.getApplicationContext(), R.string.toast_plantilla_demasiado_larga, Toast.LENGTH_LONG).show();
			
		}else
			Toast.makeText(this.getApplicationContext(), R.string.toast_datos_plantilla_incorrectos, Toast.LENGTH_LONG).show();
	}
	
	
	/**
	 * Pregunta si se desea borrar la plantilla seleccionada y establece el comportamiento para cada uno de los casos afirmativo o negativo. 
	 */
	private void borrarPlantilla(){
		//Comprobamos que se haya seleccionado una plantilla para borrar
		if(plantillaSeleccionada != null){
			//Borramos el registro con confirmación
	        AlertDialog.Builder dialogEliminar = new AlertDialog.Builder(this);
	        dialogEliminar.setIcon(android.R.drawable.ic_dialog_alert);
	        dialogEliminar.setTitle(getResources().getString(R.string.toast_titulo_eliminar_plantilla));
	        dialogEliminar.setMessage(getResources().getString(R.string.toast_mensaje_eliminar_plantilla));
	        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) {
	        		//Borramos la plantilla de BD
		        	GestorMensajeriaDAO.borrarPlantilla(PlantillasActivity.this, plantillaSeleccionada.getId());
		            
		        	//Informamos al usuario de la finalizacion del procesos
		        	Toast.makeText(PlantillasActivity.this, R.string.toast_confirmacion_eliminar_plantilla, Toast.LENGTH_SHORT).show();
		            
		            //Actualizamos las colecciones y la lista
		            Set<Plantilla> plantillasActualizadas = new HashSet<Plantilla>(plantillas);
		            plantillasActualizadas.remove(plantillaSeleccionada);
		            obtenerPlantillas(plantillasActualizadas);
		            limpiarSeleccion();
		            
		            refrescarListaPlantillas();
	        	}

	        });

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

	/**
	 * Refresca la lista de plantillas para que se muestren los cambios
	 */
	private void refrescarListaPlantillas(){
		adapterPlantillas = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,nombresPlantillas); 
		lstPlantillas.setAdapter(adapterPlantillas);
	}
	
	
	/**
	 * Limpia los campos destinados a la edición del nombre y el contenido de la plantilla
	 */
	private void limpiarSeleccion() {
		EditText editNombrePlantilla = (EditText)findViewById(R.id.EditNombrePlantilla);
		EditText editCuerpoPlantilla = (EditText)findViewById(R.id.EditCuerpoPlantilla);
		
		editNombrePlantilla.getText().clear();  
		editCuerpoPlantilla.getText().clear();
		
		plantillaSeleccionada = null;
	}

}
