package pfc.android.gestormensajeria.dao;

import java.util.HashMap;
import java.util.Map;

import pfc.android.gestormensajeria.entidades.ComponenteGrupo;
import pfc.android.gestormensajeria.entidades.Grupo;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;

/**
 * Clase para el acceso a los datos de los grupos de contactos. Será la única encargada de acceder a BD para todo lo relacionado con los grupos. Para ello se apoya en la clase GestorMensajeriaDBAdapter.
 * @author Francisco José Lamela Rincón
  */
public class GrupoDAO {
	/**
	 * Propiedad de tipo GestorMensajeriaDBAdapter para manejar los accesos a BD
	 */
	private GestorMensajeriaDBAdapter dbAdapter;
	
	
	/**
	 * Obtiene los datos de destinatarios asociados a cada grupo indexados por nombre de grupo
	 * @param context
	 * @return
	 */
	@SuppressWarnings("deprecation")	
	public Map<String, Grupo> obtenerGrupos(Context context){
		Map<String, Grupo> grupos = new HashMap<String, Grupo>();
		
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		Cursor cursorGrupos = dbAdapter.getGrupos();
		((Activity)context).startManagingCursor(cursorGrupos);
			
		//Recorremos el cursor y obtenemos los datos
		if(cursorGrupos != null && cursorGrupos.moveToFirst()){
		
			for(int i=0; i<cursorGrupos.getCount(); i++){

				//Obtenemos los datos del grupo
				Integer id = cursorGrupos.getInt(cursorGrupos.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.GRUPOS_ID));
				String nombre = cursorGrupos.getString(cursorGrupos.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.GRUPOS_NOMBRE)).toString();
				Integer idContacto = cursorGrupos.getInt(cursorGrupos.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.GRUPOS_ID_CONTACTO));
				String nombreContacto = cursorGrupos.getString(cursorGrupos.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.GRUPOS_NOMBRE_CONTACTO)).toString();
				
				//Añadimos al resultado de la consulta
				if(!grupos.containsKey(nombre))
					grupos.put(nombre, new Grupo(nombre));
				
				grupos.get(nombre).incluirDestinatario(new ComponenteGrupo(id, nombre, idContacto, nombreContacto));
				
				//Nos vamos al siguiente elemento del cursor
				cursorGrupos.moveToNext();
			}
		}

		((Activity)context).stopManagingCursor(cursorGrupos);
		
		if(cursorGrupos != null && !cursorGrupos.isClosed())
			cursorGrupos.close();
		
		dbAdapter.cerrar();
		
		return grupos;
	}
	
	
	/**
	 * Obtiene un grupo a partir del nombre del mismo
	 * @param context
	 * @param nombre
	 * @return
	 */
	@SuppressWarnings("deprecation")	
	public Grupo obtenerGrupoPorNombre(Context context, String nombre){
		Grupo grupo = null;
		
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		Cursor cursorGrupos = dbAdapter.getGrupoPorNombre(nombre);
		((Activity)context).startManagingCursor(cursorGrupos);
			
		//Recorremos el cursor y obtenemos los datos
		if(cursorGrupos.moveToFirst()){
			for(int i=0; i<cursorGrupos.getCount(); i++){

				//Obtenemos los datos del grupo
				Integer id = cursorGrupos.getInt(cursorGrupos.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.GRUPOS_ID));
				Integer idContacto = cursorGrupos.getInt(cursorGrupos.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.GRUPOS_ID_CONTACTO));
				String nombreContacto = cursorGrupos.getString(cursorGrupos.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.GRUPOS_NOMBRE_CONTACTO)).toString();
				
				//Inicializamos el grupo
				if(grupo == null)
					grupo = new Grupo(nombre);
				
				//Añadimos al resultado de la consulta
				grupo.incluirDestinatario(new ComponenteGrupo(id, nombre, idContacto, nombreContacto));
				
				//Nos vamos al siguiente elemento del cursor
				cursorGrupos.moveToNext();
			}
		}

		((Activity)context).stopManagingCursor(cursorGrupos);
		
		if(cursorGrupos != null && !cursorGrupos.isClosed())
			cursorGrupos.close();
		
		dbAdapter.cerrar();
		
		return grupo;
	}
	
	
	/**
	 * Crea un nuevo grupo en BD
	 * @param context
	 * @param grupo
	 * @return
	 */
	public boolean insertarGrupo(Context context, Grupo grupo){
		boolean ok = false;
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		//Comprobamos que no exista ya un grupo con ese nombre
		Cursor cursor = dbAdapter.getGrupoPorNombre(grupo.getNombre()); 
		if(cursor == null || cursor.getCount() <= 0){
			ok = true;
			
			//Insertamos el nuevo grupo teniendo en cuenta que es un registro por cada destinatario
			for(ComponenteGrupo cg: grupo.getDestinatarios()){
				ContentValues reg = new ContentValues();
				reg.put(GestorMensajeriaDBAdapter.GRUPOS_NOMBRE, cg.getNombre());
				reg.put(GestorMensajeriaDBAdapter.GRUPOS_ID_CONTACTO, cg.getIdDestinatario());
				
				dbAdapter.insertGrupo(reg);				
			}

		}
		
		if(cursor != null && !cursor.isClosed())
			cursor.close();
		
		dbAdapter.cerrar();
		
		return ok;
	}
	
	
	/**
	 * Asocia un nuevo destinatario al grupo
	 * @param context
	 * @param nombre
	 * @param idContacto
	 * @param nombreContacto
	 * @return
	 */
	public ComponenteGrupo insertarComponenteGrupo (Context context, String nombre, Integer idContacto, String nombreContacto){
		ComponenteGrupo nuevoComponenteGrupo = null;
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		//Comprobamos que no exista ya un grupo con ese nombre
		Cursor cursor = dbAdapter.getGrupoPorNombreYDestinatario(nombre, idContacto); 
		if(cursor == null || cursor.getCount() <= 0){
			//Insertamos el nuevo grupo teniendo en cuenta que es un registro por cada destinatario
			ContentValues reg = new ContentValues();
			reg.put(GestorMensajeriaDBAdapter.GRUPOS_NOMBRE, nombre);
			reg.put(GestorMensajeriaDBAdapter.GRUPOS_ID_CONTACTO, idContacto);
			reg.put(GestorMensajeriaDBAdapter.GRUPOS_NOMBRE_CONTACTO, nombreContacto);
			
			Long idNuevo = dbAdapter.insertGrupo(reg);
			if(idNuevo != -1)
				nuevoComponenteGrupo = new ComponenteGrupo(idNuevo.intValue(), nombre, idContacto, nombreContacto);
		}
		
		if(cursor != null && !cursor.isClosed())
			cursor.close();
		
		dbAdapter.cerrar();
		
		return nuevoComponenteGrupo;
	}
	

	/**
	 * Borra completamente un grupo de la BD
	 * @param context
	 * @param grupo
	 */
	public void borrarGrupo(Context context, Grupo grupo){
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		dbAdapter.abrir();
		
		for(ComponenteGrupo cg: grupo.getDestinatarios()){
			dbAdapter.deleteComponenteGrupo(cg.getId());			
		}
		
		dbAdapter.cerrar();
	}
	
	
	/**
	 * Elimina un destinatario del grupo
	 * @param context
	 * @param id
	 */
	public void borrarComponenteGrupo(Context context, Integer id){
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		dbAdapter.deleteComponenteGrupo(id);
		dbAdapter.cerrar();
	}
}
