/*
 *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
 *
 *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  Additional permission under GNU GPL version 3 section 7:
 *
 *  If you modify this program, or any covered work, by linking or
 *  combining it with the OpenSSL project's OpenSSL library (or a
 *  modified version of that library), containing parts covered by the
 *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
 *  grants you additional permission to convey the resulting work.
 *  Corresponding Source for a non-source form of such a combination
 *  shall include the source code for the parts of OpenSSL used as well
 *  as that of the covered work.
 */

package org.sflphone.loaders;

import java.util.ArrayList;

import org.sflphone.model.CallContact;

import android.content.AsyncTaskLoader;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.Contacts;

public class ContactsLoader extends AsyncTaskLoader<Bundle> {
    
//    private static final String TAG = ContactsLoader.class.getSimpleName();

    // These are the Contacts rows that we will retrieve.
    static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY, Contacts.STARRED };
    static final String[] CONTACTS_PHONES_PROJECTION = new String[] { Phone.NUMBER, Phone.TYPE };
    static final String[] CONTACTS_SIP_PROJECTION = new String[] { SipAddress.SIP_ADDRESS, SipAddress.TYPE };

    String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))";
    Uri baseUri;

    public ContactsLoader(Context context, Uri u) {
        super(context);
        baseUri = u;
    }

    @Override
    public Bundle loadInBackground() {
        ArrayList<CallContact> contacts = new ArrayList<CallContact>();
        ArrayList<CallContact> starred = new ArrayList<CallContact>();

        Cursor result = getContext().getContentResolver().query(baseUri, CONTACTS_SUMMARY_PROJECTION, select, null,
                Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
        int iID = result.getColumnIndex(Contacts._ID);
        int iName = result.getColumnIndex(Contacts.DISPLAY_NAME);
        int iPhoto = result.getColumnIndex(Contacts.PHOTO_ID);
        int iStarred = result.getColumnIndex(Contacts.STARRED);
        CallContact.ContactBuilder builder = CallContact.ContactBuilder.getInstance();
        
        while (result.moveToNext()) {
            builder.startNewContact(result.getLong(iID), result.getString(iName), result.getLong(iPhoto));
            
//            Cursor cPhones = getContext().getContentResolver().query(Phone.CONTENT_URI, CONTACTS_PHONES_PROJECTION,
//                    Phone.CONTACT_ID + " =" + result.getLong(iID), null, null);

//            while (cPhones.moveToNext()) {
//                builder.addPhoneNumber(cPhones.getString(cPhones.getColumnIndex(Phone.NUMBER)), cPhones.getInt(cPhones.getColumnIndex(Phone.TYPE)));
////                Log.i(TAG,"Phone:"+cPhones.getString(cPhones.getColumnIndex(Phone.NUMBER)));
//            }
//            cPhones.close();
//
//            Cursor cSip = getContext().getContentResolver().query(Phone.CONTENT_URI, CONTACTS_SIP_PROJECTION,
//                    Phone.CONTACT_ID + "=" + result.getLong(iID), null, null);
//
//            while (cSip.moveToNext()) {
//                builder.addSipNumber(cSip.getString(cSip.getColumnIndex(SipAddress.SIP_ADDRESS)), cSip.getInt(cSip.getColumnIndex(SipAddress.TYPE)));
////                Log.i(TAG,"Phone:"+cSip.getString(cSip.getColumnIndex(SipAddress.SIP_ADDRESS)));
//            }
//            cSip.close();

            contacts.add(builder.build());
            if (result.getInt(iStarred) == 1) {
                starred.add(builder.build());
            }
           
        }        
        
        result.close();
        Bundle toReturn = new Bundle();
        
       toReturn.putParcelableArrayList("Contacts", contacts);
       toReturn.putParcelableArrayList("Starred", starred);

        return toReturn;
    }
}
