package pfc.android.gestormensajeria.dao;

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

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

/**
 * Clase para el acceso a los datos de las plantillas. Será la única encargada de acceder a BD para todo lo relacionado con las plantillas. Para ello se apoya en la clase GestorMensajeriaDBAdapter.
 * @author Francisco José Lamela Rincón
  */
public class PlantillaDAO{
	
	/**
	 * Propiedad de tipo GestorMensajeriaDBAdapter a través de la cual realizaremos los accesos a BD 
	 */
	private GestorMensajeriaDBAdapter dbAdapter;
	
	
	/**
	 * Obtiene todos los datos de las plantillas registradas en la BD
	 * @param context Activity desde la que se hace el acceso
	 * @param idPlantilla Si se indica se filtrará la búsqueda por ese id
	 * @return Set de Plantilla con los datos de las plantillas encontradas
	 */
	@SuppressWarnings("deprecation")	
	public Set<Plantilla> obtenerPlantillas(Context context, Integer idPlantilla){
		Set<Plantilla> plantillas = new HashSet<Plantilla>();
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		//Si nos han indicado un id de plantilla buscamos por ese id
		Cursor cursorPlantillas = null;
		if(idPlantilla != null)
			cursorPlantillas = dbAdapter.getPlantillaPorId(idPlantilla);
		else
			cursorPlantillas = dbAdapter.getPlantillas();

		((Activity)context).startManagingCursor(cursorPlantillas);

		//Recorremos el cursor y obtenemos los datos
		if(cursorPlantillas != null && cursorPlantillas.moveToFirst()){
			for(int i=0; i<cursorPlantillas.getCount(); i++){
				//Obtenemos los datos de la plantilla
				Integer id = cursorPlantillas.getInt(cursorPlantillas.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.PLANTILLAS_ID));
				String nombre = cursorPlantillas.getString(cursorPlantillas.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.PLANTILLAS_NOMBRE)).toString();
				String contenido = cursorPlantillas.getString(cursorPlantillas.getColumnIndexOrThrow(GestorMensajeriaDBAdapter.PLANTILLAS_CONTENIDO)).toString();
				
				//Añadimos al resultado de la consulta
				plantillas.add(new Plantilla(id, nombre, contenido));
				
				//Nos vamos al siguiente elemento del cursor
				cursorPlantillas.moveToNext();
			}
		}
		
		((Activity)context).stopManagingCursor(cursorPlantillas);

		if(cursorPlantillas != null && !cursorPlantillas.isClosed())
			cursorPlantillas.close();
		
		dbAdapter.cerrar();
		
		return plantillas;
	}
	
	
	/**
	 * Inserta una nueva plantilla en la BD
	 * @param context Activity desde la que se hace el acceso
	 * @param nombre nombre para la plantilla
	 * @param contenido contenido para la plantilla
	 * @return Un objeto de tipo Plantilla completado con el id asignado al hacer la inserción en BD
	 */
	public Plantilla insertarPlantilla(Context context, String nombre, String contenido){
		Plantilla nuevaPlantilla = null;
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		//Comprobamos que no exista ya una plantilla con ese nombre
		Cursor cursor = dbAdapter.getPlantillaPorNombre(nombre); 
		if(cursor == null || cursor.getCount() <= 0){
			//Insertamos la nueva plantilla
			ContentValues reg = new ContentValues();
			reg.put(GestorMensajeriaDBAdapter.PLANTILLAS_NOMBRE, nombre);
			reg.put(GestorMensajeriaDBAdapter.PLANTILLAS_CONTENIDO, contenido);
			
			//Hacemos la insercción y obtenemos como resultado el id asignado al nuevo registro
			Long id = dbAdapter.insertPlantilla(reg);
			
			//Creamos una Plantilla con todos los datos
			nuevaPlantilla = new Plantilla(id.intValue(), nombre, contenido);
		}
		
		if(cursor != null && !cursor.isClosed())
			cursor.close();
		
		dbAdapter.cerrar();
		
		return nuevaPlantilla;
	}
	
	
	/**
	 * Actualiza la plantilla cuyos datos se pasan como parámetro
	 * @param context Activity desde la que se hace el acceso
	 * @param plantilla Objeto de tipo Plantilla con los datos para actualizar
	 * @return 
	 */
	public boolean actualizarPlantilla(Context context, Plantilla plantilla){
		boolean ok = false;
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		//Comprobamos que exista ya una plantilla con ese nombre
		Cursor cursor = dbAdapter.getPlantillaPorNombre(plantilla.getNombre()); 
		if(cursor != null && cursor.getCount() > 0){
			ok = true;
			
			//Actualizamos la plantilla
			ContentValues reg = new ContentValues();
			reg.put(GestorMensajeriaDBAdapter.PLANTILLAS_NOMBRE, plantilla.getNombre());
			reg.put(GestorMensajeriaDBAdapter.PLANTILLAS_CONTENIDO, plantilla.getContenido());
			
			dbAdapter.updatePlantillas(reg);
		}
		
		if(cursor != null && !cursor.isClosed())
			cursor.close();
		
		dbAdapter.cerrar();
		
		return ok;
	}
	
	
	/**
	 * Borra la plantilla cuyo identificador coincide con el pasado como parámetro
	 * @param context Activity desde la que se hace el acceso
	 * @param id Identificador de la plantilla que se quiere borrar 
	 */
	public void borrarPlantilla(Context context, final Integer id){
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		dbAdapter.abrir();
		dbAdapter.deletePlantilla(id);
		dbAdapter.cerrar();
	}
}
