package pfc.android.gestormensajeria.activities;

import java.util.Calendar;

import pfc.android.gestormensajeria.R;
import pfc.android.gestormensajeria.parametros.ParametrosNavegacion;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;

/**
 * Activity encargada de recoger los criterios y filtros de búsqueda sobre los SMS registrados en el sistema y lanzar dicha búsqueda
 * @author Francisco José Lamela Rincón
 *
 */
public class BusquedaActivity extends FragmentActivity{
	
	/**
	 * Propiedad para manejar el texto que se quiere usar de filtro de busqueda
	 */
	private EditText txtTextoBusqueda;
	
	/**
	 * Propiedad para manejar el botón con el que se lanzará la búsqueda
	 */
	private View btnBuscar;
	
	/**
	 * Propiedad para manejar el checkbox con el que indicaremos si queremos buscar el texto en el remitente del mensaje
	 */
	private CheckBox cbxBuscarEnRemitente;
	
	/**
	 * Propiedad para manejar el checkbox con el que indicaremos si queremos buscar el texto en el asunto del mensaje en caso de disponer de esta información
	 */
	private CheckBox cbxBuscarEnAsunto;
	
	/**
	 * Propiedad para manejar el checkbox con el que indicaremos si queremos buscar el texto en el cuerpo del mensaje
	 */
	private CheckBox cbxBuscarEnCuerpo;
	
	
	//Propiedades para el manejo de las fechas
	/**
	 * Propiedad para manejar el checkbox con el que indicaremos si queremos hacer un filtrado por fechas
	 */
	private CheckBox cbxFiltrarPorFechas;
	
	/**
	 * Propiedad para manejar el texto que recogerá la fecha desde la cual se quiere filtrar
	 */
	private TextView txtFechaDesde;
	
	/**
	 * Propiedad para manejar el texto que recogerá la fecha hasta la cual se quiere filtrar
	 */
	private TextView txtFechaHasta;
	
	/**
	 * Propiedad para manejar el botón que lanza el control de seleccion de fecha para la fecha desde 
	 */
	private View btnCalendarioDesde;
	
	/**
	 * Propiedad para manejar el botón que lanza el control de seleccion de fecha para la fecha hasta
	 */
	private View btnCalendarioHasta;
	
	/**
	 * Propiedad para manejar el año de la fecha desde
	 */
	private int anioDesde;
	
	/**
	 * Propiedad para manejar el mes de la fecha desde
	 */
	private int mesDesde; 
	
	/**
	 * Propiedad para manejar el día de la fecha desde
	 */
	private int diaDesde;
	
	/**
	 * Propiedad para manejar el año de la fecha hasta
	 */
	private int anioHasta;
	
	/**
	 * Propiedad para manejar el mes de la fecha hasta
	 */
	private int mesHasta; 
	
	/**
	 * Propiedad para manejar el día de la fecha hasta
	 */
	private int diaHasta; 
	
	/**
	 * Propiedad con la que indicaremos si la fecha seleccionada en el selector de fechas debe colocarse en la fecha desde o la fecha hasta
	 */
	private boolean esParaDesde = true;

	/**
	 * Constante con el id del selector de fechas
	 */
	static final int DATE_DIALOG_ID = 0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_busqueda);

		//Obtenemos los controles
	    txtTextoBusqueda = (EditText)findViewById(R.id.txtTextoBusqueda);
	    btnBuscar = findViewById(R.id.btnBuscar);
	    cbxBuscarEnRemitente = (CheckBox)findViewById(R.id.cbxBuscarEnRemitente);
        cbxBuscarEnAsunto = (CheckBox)findViewById(R.id.cbxBuscarEnAsunto);
        cbxBuscarEnCuerpo = (CheckBox)findViewById(R.id.cbxBuscarEnCuerpo);
        cbxFiltrarPorFechas= (CheckBox)findViewById(R.id.cbx_filtrar_por_fechas);
	    txtFechaDesde = (TextView) findViewById(R.id.txt_fecha_desde);
		txtFechaHasta = (TextView) findViewById(R.id.txt_fecha_hasta);
	    btnCalendarioDesde = findViewById(R.id.btnAbrirCalendarioDesde);
	    btnCalendarioHasta = findViewById(R.id.btnAbrirCalendarioHasta);
	    
        //Implementamos el evento onClick de los controles que lo necesiten	    
	    establecerEventosOnClick();

	    //Inicializamos las fechas
	    final Calendar calendar = Calendar.getInstance();
	    anioDesde = calendar.get(Calendar.YEAR);
	    mesDesde = calendar.get(Calendar.MONTH);
	    diaDesde = calendar.get(Calendar.DAY_OF_MONTH);
	    actualizaFecha(true);
	    
	    anioHasta = calendar.get(Calendar.YEAR);
	    mesHasta = calendar.get(Calendar.MONTH);
	    diaHasta = calendar.get(Calendar.DAY_OF_MONTH);
	    actualizaFecha(false);
	}


	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case DATE_DIALOG_ID:
			if(esParaDesde)
				return new DatePickerDialog(this, fechaListener, anioDesde, mesDesde, diaDesde);
			else
				return new DatePickerDialog(this, fechaListener, anioHasta, mesHasta, diaHasta);
		}
		return null;
	}
	
	

	// ***********************  METODOS AUXILIARES  ***********************
	
	/**
	 * Implementa el evento onClick de los controles que lo necesiten
	 */
	private void establecerEventosOnClick() {
		//Comportamiento del botón buscar
		 btnBuscar.setOnClickListener(new OnClickListener() {			
				@Override
				public void onClick(View v) {
					//Creamos el Intent
	                Intent intent = new Intent(BusquedaActivity.this, ResultadosActivity.class);

	                //Creamos la información a pasar entre actividades
	                Bundle b = new Bundle();
	                b.putString(ParametrosNavegacion.CADENA_BUSQUEDA, txtTextoBusqueda.getText().toString());
	                b.putBoolean(ParametrosNavegacion.BUSCAR_EN_REMITENTE, cbxBuscarEnRemitente.isChecked());
	                b.putBoolean(ParametrosNavegacion.BUSCAR_EN_ASUNTO, cbxBuscarEnAsunto.isChecked());
	                b.putBoolean(ParametrosNavegacion.BUSCAR_EN_MENSAJE, cbxBuscarEnCuerpo.isChecked());
	                
	                if(cbxFiltrarPorFechas.isChecked()){
	                	Calendar c = Calendar.getInstance();
	                	c.set(anioDesde, mesDesde, diaDesde, 0, 0, 0);
	                	//Pasamos las fechas convertidas en long, ya que es el formato que admite sqlite
	                    b.putLong(ParametrosNavegacion.FECHA_DESDE, c.getTimeInMillis());
	                    c.set(anioHasta, mesHasta, diaHasta, 23, 59, 59);
	                    b.putLong(ParametrosNavegacion.FECHA_HASTA, c.getTimeInMillis());
	                }

	                //Añadimos la información al intent
	                intent.putExtras(b);

	                //Iniciamos la nueva actividad
	                startActivity(intent);
				}
			});
		 
		 //Comportamiento del botón para abrir el selector de fecha de la fecha desde
		 btnCalendarioDesde.setOnClickListener(new OnClickListener() {
				@SuppressWarnings("deprecation")
				@Override
				public void onClick(View v) {
					esParaDesde = true;
					showDialog(DATE_DIALOG_ID);
				}
			});
		    
		 //Comportamiento del botón para abrir el selector de fecha de la fecha desde
		 btnCalendarioHasta.setOnClickListener(new OnClickListener() {
				@SuppressWarnings("deprecation")
				@Override
				public void onClick(View v) {
					esParaDesde = false;
					showDialog(DATE_DIALOG_ID);			
				}
			});
		
	}
	
	
	/**
	 * Actualiza el valor mostrado en los campos para la fecha desde o hasta en función del parámetro fechaDesde
	 * @param fechaDesde Si es TRUE  actualiza la fecha desde, si es FALSE actualiza la fecha hasta
	 */
	private void actualizaFecha(boolean fechaDesde){
		if(fechaDesde)
			txtFechaDesde.setText(new StringBuilder().append(diaDesde).append("-").append(mesDesde + 1).append("-").append(anioDesde).append(" "));
		else
			txtFechaHasta.setText(new StringBuilder().append(diaHasta).append("-").append(mesHasta + 1).append("-").append(anioHasta).append(" "));
	}
	
	
	/**
	 * Establece el listener para el selector de fechas
	 */
	private DatePickerDialog.OnDateSetListener fechaListener = new DatePickerDialog.OnDateSetListener() {
		
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {
			if(esParaDesde){
				diaDesde = dayOfMonth;
				mesDesde = monthOfYear;
				anioDesde = year;
			}else{
				diaHasta = dayOfMonth;
				mesHasta = monthOfYear;
				anioHasta = year;
			}
			actualizaFecha(esParaDesde);
		}
	};
	
}
