/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: Feeder Private class for unified viewer. Fetches data from the
 *              message store for the given message id.
 *
 */
#include "univiewerfeeder_p.h"
// SYSTEM INCLUDES
#include <msvstd.h>
#include <s60qconversions.h>
#include <msvids.h>
#include <qtcontactsglobal.h>
#include "qtcontacts.h"
#include "qcontactdetailfilter.h"

// USER INCLUDES
#include "nativemessageconsts.h"
#include "univiewerfeeder.h"
#include "unidatamodelloader.h"
#include "debugtraces.h"

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::UniViewerFeederPrivate
// @see header file
// ---------------------------------------------------------------------------
UniViewerFeederPrivate::UniViewerFeederPrivate(qint32 msgId,
                                               UniViewerFeeder* feeder) :
    q_ptr(feeder), mSlideCount(0), mSession(NULL)
{
    TRAP_IGNORE(initL(msgId));
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::~UniViewerFeederPrivate
// @see header file
// ---------------------------------------------------------------------------
UniViewerFeederPrivate::~UniViewerFeederPrivate()
{
    q_ptr = NULL;
    clearContent();
    if(mPluginLoader)
    {
        delete mPluginLoader;
        mPluginLoader = NULL;
    }
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::initL
// Symbian specific constructions
// ---------------------------------------------------------------------------
//
void UniViewerFeederPrivate::initL(qint32 msgId)
{
    QDEBUG_WRITE("UniViewerFeederPrivate::initL start");
    TMsvId serviceId = KMsvNullIndexEntryId;
    mPluginInterface = NULL;
    mMsgId = msgId;
    mPluginLoader = new UniDataModelLoader();
    mPluginInterface = mPluginLoader->getDataModelPlugin(ConvergedMessage::Sms);

    mSession = mPluginInterface->session();
    mSession->GetEntry(msgId, serviceId, mEntry);
    QDEBUG_WRITE("UniViewerFeederPrivate::initL end");
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::fetchDetails
// Fetches message details from the store
// ---------------------------------------------------------------------------
void UniViewerFeederPrivate::fetchDetails()
{
    TRAP_IGNORE(fetchDetailsL());
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::msgType
// Returns the message type.
// ---------------------------------------------------------------------------
qint32 UniViewerFeederPrivate::msgType()
{
    return mEntry.iMtm.iUid;
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::isIncoming
// Returns if it is a incoming message.
// ---------------------------------------------------------------------------
bool UniViewerFeederPrivate::isIncoming()
{
    if (mEntry.Parent() == KMsvGlobalInBoxIndexEntryId)
    {
        return true;
    }
    return false;
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::priority
// Returns the message priority.
// ---------------------------------------------------------------------------
int UniViewerFeederPrivate::priority()
{
    if (mEntry.Priority() == EMsvHighPriority)
    {
        return ConvergedMessage::High;
    }
    else if (mEntry.Priority() == EMsvLowPriority)
    {
        return ConvergedMessage::Low;
    }
    return ConvergedMessage::Normal;
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::subject
// Returns the message subject.
// ---------------------------------------------------------------------------
QString UniViewerFeederPrivate::subject()
{
    return mPluginInterface->subject();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::subject
// Returns the message subject.
// ---------------------------------------------------------------------------

int UniViewerFeederPrivate::sendingState()
{
    return mEntry.SendingState();
}
// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::timeStamp
// Returns the time stamp
// ---------------------------------------------------------------------------
QDateTime UniViewerFeederPrivate::timeStamp()
{

    return mPluginInterface->timeStamp();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::fetchDetailsL
// Fetches message details from the store.
// ---------------------------------------------------------------------------
void UniViewerFeederPrivate::fetchDetailsL()
{
    QDEBUG_WRITE("UniViewerFeederPrivate fetchDetailsL : SMS start");
    if (msgType() == KSenduiMtmSmsUidValue)
    {
        QString body;
        mPluginInterface->body(body);
        q_ptr->emitMsgBody(body);
    }
    QDEBUG_WRITE("UniViewerFeederPrivate fetchDetailsL : SMS END");
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::hasAttachments
// @see header file
// ---------------------------------------------------------------------------
bool UniViewerFeederPrivate::hasAttachments()
{
    return mPluginInterface->hasAttachment();
}
// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::attachmentsList
// @see header file
// ---------------------------------------------------------------------------
UniMessageInfoList UniViewerFeederPrivate::attachmentsList()
{
    return mPluginInterface->attachmentList();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::attachmentCount
// @see header file
// ---------------------------------------------------------------------------
int UniViewerFeederPrivate::attachmentCount()
{
    return mPluginInterface->attachmentCount();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::objectsList
// @see header file
// ---------------------------------------------------------------------------
UniMessageInfoList UniViewerFeederPrivate::objectsList()
{
    return mPluginInterface->objectList();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::objectCount
// @see header file
// ---------------------------------------------------------------------------
int UniViewerFeederPrivate::objectCount()
{
    return mPluginInterface->objectCount();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::slideCount
// @see header file
// ---------------------------------------------------------------------------
int UniViewerFeederPrivate::slideCount()
{
    return mSlideCount;
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::slideContent
// @see header file
// ---------------------------------------------------------------------------
UniMessageInfoList UniViewerFeederPrivate::slideContent(int slidenum)
{
    return mPluginInterface->slideContent(slidenum);
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::updateContent
// @see header file
// ---------------------------------------------------------------------------
void UniViewerFeederPrivate::updateContent(qint32 msgId)
{
  
    if (msgId != mMsgId)
    {
        mMsgId = msgId;
        TMsvId serviceId = KMsvNullIndexEntryId;
        mSession->GetEntry(msgId, serviceId, mEntry);
        clearContent();
    }

    if (msgType() == KSenduiMtmSmsUidValue)
    {
        mPluginInterface = mPluginLoader->getDataModelPlugin(ConvergedMessage::Sms);
        mPluginInterface->setMessageId(msgId);
    }

    if (msgType() == KSenduiMtmMmsUidValue)
    {
        mPluginInterface = mPluginLoader->getDataModelPlugin(ConvergedMessage::Mms);
        mPluginInterface->setMessageId(msgId);
        mSlideCount = mPluginInterface->slideCount();
    }
    mPluginInterface->toRecipientList(mToAddressList);
    mPluginInterface->ccRecipientList(mCcAddressList);
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::toAddressList
// @see header file
// ---------------------------------------------------------------------------
ConvergedMessageAddressList UniViewerFeederPrivate::toAddressList()
{
    QString alias = QString();
    for (int i = 0; i < mToAddressList.count(); ++i)
    {
        GetNameFromContacts(mToAddressList.at(i)->address(), alias);
        mToAddressList.at(i)->setAlias(alias);
        alias.clear();
    }
    return mToAddressList;
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::ccAddressList
// @see header file
// ---------------------------------------------------------------------------
ConvergedMessageAddressList UniViewerFeederPrivate::ccAddressList()
{
    QString alias = QString();
    for (int i = 0; i < mCcAddressList.count(); ++i)
    {
        GetNameFromContacts(mCcAddressList.at(i)->address(), alias);
        mCcAddressList.at(i)->setAlias(alias);
        alias.clear();

    }
    return mCcAddressList;
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::messageSize
// @see header file
// ---------------------------------------------------------------------------
int UniViewerFeederPrivate::messageSize()
{
    return mPluginInterface->messageSize();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::fromAddressAndAlias
// @see header file
// ---------------------------------------------------------------------------
void UniViewerFeederPrivate::fromAddressAndAlias(QString& from, QString& alias)
{
    mPluginInterface->fromAddress(from);
    GetNameFromContacts(from, alias);
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::clearContent
// @see header file
// ---------------------------------------------------------------------------
void UniViewerFeederPrivate::clearContent()
{
    for (int i = 0; i < mToAddressList.count(); ++i)
    {
        delete mToAddressList.at(i);
    }
    mToAddressList.clear();

    for (int i = 0; i < mCcAddressList.count(); ++i)
    {
        delete mCcAddressList.at(i);
    }

    mCcAddressList.clear();
}

// ---------------------------------------------------------------------------
// UniViewerFeederPrivate::GetNameFromContacts
// @see header file
//----------------------------------------------------------------------------
int UniViewerFeederPrivate::GetNameFromContacts(const QString& address,
                                                QString& alias)
{
    QContactManager contactManager("symbian");
    //set filter
    QContactDetailFilter phoneFilter;
    phoneFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName,
                                        QContactPhoneNumber::FieldNumber);
    phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith);

    phoneFilter.setValue(address); // this is the phone number to be resolved

    QList<QContactSortOrder> sortOrder;
    QList<QContact> matchingContacts =
            contactManager.contacts(phoneFilter,
                                    sortOrder,
                                    QStringList());
                                    
    int count = 0;
    if (matchingContacts.count() > 0)
    {
        QContact match = matchingContacts.at(0);       
        
        QString displayLabel = match.displayLabel();

        if (displayLabel != "Unnamed")
        {
            alias.append(displayLabel);
        }
        
        QList<QContactPhoneNumber> numbers =
                match.details<QContactPhoneNumber> ();
        count = numbers.count();
     
    }
    
    return count;
}

// EOF
