package pfc.android.gestormensajeria.dao;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;

/**
 * Clase para el acceso a los datos de los contactos. Será la única encargada de acceder a BD para todo lo relacionado con los contactos. Para ello se apoya en la clase GestorMensajeriaDBAdapter.
 * @author Francisco José Lamela Rincón
 * 
 */
public class ContactosDAO {
	/**
	 * Propiedad de tipo GestorMensajeriaDBAdapter para manejar los accesos a BD
	 */
	private GestorMensajeriaDBAdapter dbAdapter;
	
	
	/**
	 * Obtiene la imagen asociada a un contacto de la agenda del dispositivo
	 * @param context
	 * @param remitente
	 * @return
	 */
	public Bitmap obtenerImagenDeContacto(Context context, String remitente){
		Bitmap imagen = null;
		
		final Integer imagenId = buscarIdDeImagen(context, remitente);
        if (imagenId != null) 
            imagen = buscarImagen(context, imagenId);

        return imagen;
	}
	
	/**
	 * Obtiene el id de la imagen asociada a un contacto de la agenda del dispositivo
	 * @param context
	 * @param remitente
	 * @return
	 */
	private Integer buscarIdDeImagen(Context context, String remitente) {
		Integer imagenId = null;
		
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		Cursor cursor = dbAdapter.obtenerIdDeImagen(context, remitente);
		try{
	       	if (cursor != null) 
	       		imagenId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
		}catch (Exception e) {
			imagenId = null;
		}
		
	    cursor.close();
	    dbAdapter.cerrar();
	    
        return imagenId;	    
	}
	

	/**
	 * Busca la imagen asociada a un contacto de la agenda del dispositivo
	 * @param context
	 * @param idImagen
	 * @return
	 */
	private Bitmap buscarImagen(Context context, Integer idImagen) {
		Bitmap imagen = null;
		
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();

		Cursor cursor = dbAdapter.obtenerImagenAPartirDeId(context, idImagen);
		
		try{
	        if (cursor != null) {
	            final byte[] thumbnailBytes = cursor.getBlob(0);
	            if (thumbnailBytes != null) {
	                imagen = BitmapFactory.decodeByteArray(thumbnailBytes, 0, thumbnailBytes.length);
	            }
	        }			
		}catch (Exception e) {
			imagen = null;
		}
        
        cursor.close();
        dbAdapter.cerrar();
        
        return imagen;
    }
	
	/**
	 * A partir de un identificador de contacto obtiene el número de teléfono asociado
	 * @param context
	 * @param idContacto
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public String obtenerNumeroDeContactoPorId(Context context, Integer idContacto){
		String numero = null;
		
		if(dbAdapter == null)
			dbAdapter = new GestorMensajeriaDBAdapter(context);
		
		dbAdapter.abrir();
		
		Cursor cursorContacto = dbAdapter.obtenerNumeroContactoAPartirDeId(context, idContacto);
		
		if(cursorContacto != null){
			((Activity)context).startManagingCursor(cursorContacto);

			//Vamos al primer elemento del cursor, ya que sólo debería haber uno
			if(cursorContacto != null && cursorContacto.moveToFirst()){
				//Obtenemos el número de teléfono
				numero = cursorContacto.getString(cursorContacto.getColumnIndexOrThrow(Phone.NUMBER)).toString();
			}
		}
		
		((Activity)context).stopManagingCursor(cursorContacto);

		if(cursorContacto != null && !cursorContacto.isClosed())
			cursorContacto.close();
		
		
		dbAdapter.cerrar();
		
		return numero;
	}
}
