package pfc.android.gestormensajeria.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import pfc.android.gestormensajeria.entidades.ComponenteGrupo;
import pfc.android.gestormensajeria.entidades.Grupo;
import pfc.android.gestormensajeria.entidades.Mensaje;
import pfc.android.gestormensajeria.entidades.ParametroConfiguracion;
import pfc.android.gestormensajeria.entidades.Plantilla;
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Bitmap;

/**
 * Clase a través de la cual se realizaran todos los accedos a datos desde la aplicación. En función de los datos requeridos esta clase hará uso de otras más específicas
 * para el acceso a esos datos requeridos
 * @author Francisco José Lamela Rincón
 *
 */
public class GestorMensajeriaDAO {
	//Posibles mensajerias con las que vamos a trabajar
	//Si se añaden mas hay que meterlas en el metodo obtenerTiposMensajeria:
	public static final String TIPO_SMS = "SMS";
	public static final String TIPO_WHATSAPP = "Whatsapp";
	public static final String TIPO_LINE = "Line";
	
	//Indices para identificar los distintos campos del mensaje
	public static final int INDICE_ID = 0;
	public static final int INDICE_REMITENTE = 1;
	public static final int INDICE_FECHA = 2;
	public static final int INDICE_CUERPO_MENSAJE = 3;
	public static final int INDICE_TI = 4;
	public static final int INDICE_PERSON = 5;
	public static final int INDICE_PROTOCOLO = 6;
	public static final int INDICE_LEIDO = 7;
	public static final int INDICE_ESTADO = 8;
	public static final int INDICE_TIPO = 9;
	public static final int INDICE_PATH_RESPUESTA_PRESENTE = 10;
	public static final int INDICE_ASUNTO = 11;
	public static final int INDICE_CENTRO_DE_SERVICIO = 12;
	public static final int INDICE_BLOQUEADO = 13;
	public static final int INDICE_NUMERO_DE_RESPUESTA = 14;
	public static final int INDICE_FECHA_EN_MILISEGUNDOS = 15;
	
	//Constante con el tamaño del array de datos de cada mensaje
	public static final int TAM_DATOS_MENSAJES = 16;
	
	
	
	//METODOS PARA LA GESTION DE LOS MENSAJES
	
	/**
	 * Devuelve un string con los tipo de mensaje que soporta la aplicación. En esta versión no tiene utilidad pero se deja para posibles ampliaciones futuras.
	 * @return
	 */
	public static String[] obtenerTiposMensajeria(){
		return new String[]{TIPO_SMS, TIPO_WHATSAPP, TIPO_LINE};
	}	
	
	
	/**
	 * Obtiene los mensajes usando los filtros pasados en la llamada.
	 * @param tipoMensaje
	 * @param textoBusqueda
	 * @param buscarEnRemitente
	 * @param buscarEnAsunto
	 * @param buscarEnMensaje
	 * @param fechaDesde
	 * @param fechaHasta
	 * @param cr
	 * @return Devuelve un mapa indexado por remitente y con valor el listado de mensajes para cada remitente
	 */
	public static HashMap<String,List<String[]>> obtenerMensajes(String tipoMensaje, String textoBusqueda, boolean buscarEnRemitente, boolean buscarEnAsunto, boolean buscarEnMensaje, Long fechaDesde, Long fechaHasta, ContentResolver cr){
		HashMap<String,List<String[]>> resultado = null;		
		
		//Lanzamos la busqueda
		if(GestorMensajeriaDAO.TIPO_SMS.equals(tipoMensaje)){
			SmsDAO gestorSMS = new SmsDAO();
			resultado = gestorSMS.obtenerMensajes(textoBusqueda, buscarEnRemitente, buscarEnAsunto, buscarEnMensaje, fechaDesde, fechaHasta, cr);
		}
		
		return resultado;
	}
	
	
	/**
	 * Transforma los datos de los mensajes pasados en un array de objetos de tipo Mensaje para facilitar su manejo
	 * @param listaMensajes
	 * @return
	 */
	public Mensaje[] obtenerMesajesDeRemitente(List<String[]> listaMensajes){
		Mensaje[] mensajes = null;
		if(listaMensajes != null && listaMensajes.size() > 0){
			//Creamos la lista de mensajes
			mensajes = new Mensaje[listaMensajes.size()];
			int indice = 0;
			for(String[] msg: listaMensajes){
				mensajes[indice] = new Mensaje(msg[INDICE_ID], msg[INDICE_REMITENTE], msg[INDICE_ASUNTO], msg[INDICE_CUERPO_MENSAJE], msg[INDICE_FECHA], msg[INDICE_FECHA_EN_MILISEGUNDOS]);
				indice++;
			}
		}
		
		return mensajes;
	}
	
	
	/**
	 * Borra el mensaje cuyo id se pasa en la llamada
	 * @param idBorrado
	 * @param cr
	 * @return
	 */
	public static boolean borrarMensaje(String idBorrado, ContentResolver cr){
		boolean borrado = false;
		if(idBorrado != null && idBorrado.length() > 0){
			SmsDAO gestorSMS = new SmsDAO();
			borrado = gestorSMS.borrarMensaje(idBorrado, cr);
		}
		
		return borrado;
	}
	
	
	
	//METODOS PARA LA GESTION DE PLANTILLAS
	
	/**
	 * Obtiene las plantillas de mensaje registradas en el sistema
	 * @param context
	 * @return
	 */
	public static Set<Plantilla> getPlantillas(Context context){
		Set<Plantilla> resultado = null;		
		
		//Lanzamos la busqueda en funcion de las plantillas registradas en el sistema
		PlantillaDAO plantillaDAO = new PlantillaDAO();
		resultado = plantillaDAO.obtenerPlantillas(context, null);
		
		return resultado;
	}
	
	
	/**
	 * Inserta una nueva plantilla en BD
	 * @param context
	 * @param nombre
	 * @param contenido
	 * @return
	 */
	public static Plantilla guardarNuevaPlantilla(Context context, String nombre, String contenido){
		PlantillaDAO plantillaDAO = new PlantillaDAO();
		return plantillaDAO.insertarPlantilla(context, nombre, contenido);
	}
	
	
	/**
	 * Actualiza en BD la plantilla pasada en la llamada
	 * @param context
	 * @param plantilla
	 * @return
	 */
	public static boolean actualizarPlantilla(Context context, Plantilla plantilla){
		PlantillaDAO plantillaDAO = new PlantillaDAO();
		return plantillaDAO.actualizarPlantilla(context, plantilla);		
	}
	
	
	/**
	 * Borra de BD la plantilla cuyo id se pasa en la llamada
	 * @param context
	 * @param idPlantilla
	 */
	public static void borrarPlantilla(Context context, Integer idPlantilla){
		PlantillaDAO plantillaDAO = new PlantillaDAO();
		plantillaDAO.borrarPlantilla(context, idPlantilla);		
	}

	
	//METODOS PARA LA GESTION DE GRUPOS
	
	/**
	 * Obtiene los grupos de destinatarios registrados en el sistema
	 * @param context
	 * @return
	 */
	public static Map<String,Grupo> getGrupos(Context context){
		GrupoDAO grupoDAO = new GrupoDAO();
		return grupoDAO.obtenerGrupos(context);
	}
	
	
	/**
	 * Obtiene un grupo a partir del nombre pasado en la llamada
	 * @param context
	 * @param nombre
	 * @return
	 */
	public static Grupo getGrupoPorNombre(Context context, String nombre){
		GrupoDAO grupoDAO = new GrupoDAO();
		return grupoDAO.obtenerGrupoPorNombre(context, nombre);
	}
	
	
	/**
	 * Borra de BD el grupo pasado en la llamada
	 * @param context
	 * @param grupo
	 */
	public static void borrarGrupo(Context context, Grupo grupo){
		GrupoDAO grupoDAO = new GrupoDAO();
		grupoDAO.borrarGrupo(context, grupo);		
	}
	
	
	/**
	 * Borra de BD el destinatario cuyo id se pasa en la llamada
	 * @param context
	 * @param idContacto
	 */
	public static void borrarComponenteGrupo(Context context, Integer idContacto){
		GrupoDAO grupoDAO = new GrupoDAO();
		grupoDAO.borrarComponenteGrupo(context, idContacto);		
	}

	
	/**
	 * Inserta en BD el destinatario para el grupo cuyo nombre se pasa en la llamada
	 * @param context
	 * @param nombre
	 * @param idContacto
	 * @param nombreContacto
	 * @return
	 */
	public static ComponenteGrupo guardarComponenteGrupo(Context context, String nombre, Integer idContacto, String nombreContacto){
		GrupoDAO grupoDAO = new GrupoDAO();
		return grupoDAO.insertarComponenteGrupo(context, nombre, idContacto, nombreContacto);
	}
	
	
	//METODOS PARA LA GESTION DE PARAMETROS DE CONFIGURACIÓN
	
	/**
	 * Obtiene el valor del parámetro de configuración a partir del código pasado en la llamada
	 * @param context
	 * @param codigo
	 * @return
	 */
	public static String obtenerValorParametroConfiguracion(Context context, String codigo){
		ConfiguracionDAO configuracionDAO = new ConfiguracionDAO();
		return configuracionDAO.obtenerValorParametroConfiguracion(context, codigo);
	}
	
	
	/**
	 * Obtiene un mapa indexado por código de todos los parámetros de configuración de la aplicación
	 * @param context
	 * @return
	 */
	public static Map<String,ParametroConfiguracion> obtenerParametrosConfiguracion(Context context){
		ConfiguracionDAO configuracionDAO = new ConfiguracionDAO();
		return configuracionDAO.obtenerParametrosConfiguracion(context);
	}
	
	
	/**
	 * Actualiza en BD los valores de los parámetros de configuración pasados en el mapa
	 * @param context
	 * @param mapaParametros
	 */
	public static void guardarParametrosConfiguracion(Context context, Map<String,String> mapaParametros){
		ConfiguracionDAO configuracionDAO = new ConfiguracionDAO();
		configuracionDAO.guardarParametrosConfiguracion(context, mapaParametros);
	}
	
	
	//METODOS PARA LA GESTION DE CONTACTOS DE LA AGENDA DEL DISPOSITIVO
	
	/**
	 * Obtiene la imagen asociada al contacto en la agenda
	 * @param context
	 * @param remitente
	 * @return
	 */
	public static Bitmap obtenerImagenDeContacto(Context context, String remitente){
		ContactosDAO contactosDAO = new ContactosDAO();
		return contactosDAO.obtenerImagenDeContacto(context, remitente);
	}
	
	
	/**
	 * Obtiene el número de teléfono asociado al contacto cuyo id se pasa en la llamada
	 * @param context
	 * @param idContacto
	 * @return
	 */
	public static String obtenerNumeroDeContactoPorId(Context context, Integer idContacto){
		ContactosDAO contactosDAO = new ContactosDAO();
		return contactosDAO.obtenerNumeroDeContactoPorId(context, idContacto);
	}
	
	
	/**
	 * Realiza el envio de un SMS usando el gestor de mensajeria por defecto y sin la intervención del usuario
	 * @param destinatario
	 * @param texto
	 */
	public static void enviarSMS(String destinatario, String texto){
		SmsDAO smsDAO = new SmsDAO();
		smsDAO.enviarSMS(destinatario, texto);
	}
}
