#ifndef API_H
#define API_H

class PIMDataReference {
    QString persistanceID() const;
    QUrl externalUrl() const;
};


class PIMJob : public QObject {
    Q_OBJECT
public:

    void exec() {
        QEventLoop loop( ... );
        connect( this, SIGNAL(done()), &loop, SLOT(quit()) );
        doStart();
        loop.exec();
    }

    void start() {
        doStart();
    }

signals:
    void done();

private:
    virtual void doStart() = 0;
};

class PIMQuery : public PIMJob {
    Q_OBJECT
public:

    void setQueryString( const QString & query ) {
        doSetQueryString( query );
    }
    QList<PIMDataReference> result() const;
private:
    void doStart();
protected:
    virtual void doSetQueryString( const QString & query );
};

class PIMDataRequest : public PIMJob {
    Q_OBJECT
public:
    explicit PIMDataRequest( const PIMDataReference & ref, const QString & part="ALL", const QStringList & acceptableMimeTypes=QStringList() );

    QByteArray data() const;
    QByteArray mimeType() const;
private:
    void doStart();
};

//
//
// Start convenience API
//
//

class EMailQuery : public PIMQuery {
    Q_OBJECT
public:
    EMailQuery();
protected:
    void doSetQueryString( const QString & query ) {
        PIMQuery::doSetQueryString( "mimetype=message/rfc822;" + query );
    }
};

class EMailRequest : public PIMDataRequest {
    Q_OBJECT
public:
    explicit EMailRequest( const PIMDataReference & ref, const QString & part="ALL" );

    KMail::Message message() const {
        Q_ASSERT( mimeType() == QLatin1String( "message/rfc822" ) );
        return KMail::Message::fromRfc822( data() );
    }
};

class CalendarEventRequest : public PIMDataRequest {
    Q_OBJECT
public:
    explicit CalendarEventRequest( const PIMDataRequest & ref );

    KCal::FooBar event() const;
};

class NotesRequest : public PIMDataRequest {
    Q_OBJECT
public:
    explicit NotesRequest( const PIMDataRequest & ref );

    KCal::BarBaz note() const;
};

// ...


void example() {
    PIMQuery query;
    query.setQueryString( "mimetype=message/rfc822; folder=/inbox; date>=2005-12-31;" );
    query.exec();
    const QList<PIMDataReference> result = query.result();

    foreach( const PIMDataReference ref, result ) {
        EMailRequest req( ref, "BODY,HEADER" );
        req.exec();
        const KMail::Message msg = req.message();
        // ...
    }
}

#endif /* API_H */

