/*
    SPDX-FileCopyrightText: 2010-2016 Ivan Cukic <ivan.cukic(at)kde.org>

    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/

#ifndef ACTIVITIES_CONSUMER_H
#define ACTIVITIES_CONSUMER_H

#include <QObject>
#include <QString>
#include <QStringList>

#include "info.h"

#include "plasma_activities_export.h"

#include <memory>

namespace KActivities
{
class ConsumerPrivate;

/*!
 * \class KActivities::Consumer
 * \inmodule PlasmaActivities
 * \inheaderfile PlasmaActivities/Consumer
 *
 * \brief Read-only information about activities.
 *
 * Contextual information can be, from the user's point of view, divided
 * into three aspects - "who am I?", "where am I?" (what are my surroundings?)
 * and "what am I doing?".
 *
 * Activities deal with the last one - "what am I doing?". The current activity
 * refers to what the user is doing at the moment, while the other activities
 * represent things that he/she was doing before, and probably will be doing
 * again.
 *
 * Activity is an abstract concept whose meaning can differ from one user to
 * another. Typical examples of activities are "developing a KDE project",
 * "studying the 19th century art", "composing music", "lazing on a Sunday
 * afternoon" etc.
 *
 * Consumer provides read-only information about activities.
 *
 * Before relying on the values retrieved by the class, make sure that the
 * serviceStatus is set to Running. Otherwise, you can get invalid data either
 * because the service is not functioning properly (or at all) or because
 * the class did not have enough time to synchronize the data with it.
 *
 * For example, if this is the only existing instance of the Consumer class,
 * the listActivities method will return an empty list.
 *
 * \code
 * void someMethod() {
 *     // Do not copy. This approach is not a good one!
 *     Consumer c;
 *     doSomethingWith(c.listActivities());
 * }
 * \endcode
 *
 * Instances of the Consumer class should be long-lived. For example, members
 * of the classes that use them, and you should listen for the changes in the
 * provided properties.
 *
 * \since 4.5
 */
class PLASMA_ACTIVITIES_EXPORT Consumer : public QObject
{
    Q_OBJECT

    /*!
     * \property KActivities::Consumer::currentActivity
     */
    Q_PROPERTY(QString currentActivity READ currentActivity NOTIFY currentActivityChanged)

    /*!
     * \property KActivities::Consumer::activities
     */
    Q_PROPERTY(QStringList activities READ activities NOTIFY activitiesChanged)

    /*!
     * \property KActivities::Consumer::serviceStatus
     */
    Q_PROPERTY(ServiceStatus serviceStatus READ serviceStatus NOTIFY serviceStatusChanged)

public:
    /*!
     * Different states of the activities service
     *
     * \value NotRunning Service is not running
     * \value Unknown Unable to determine the status of the service
     * \value Running Service is running properly
     */
    enum ServiceStatus {
        NotRunning,
        Unknown,
        Running,
    };

    /*!
     *
     */
    explicit Consumer(QObject *parent = nullptr);

    ~Consumer() override;

    /*!
     * Returns the id of the current activity
     *
     * \note Activity ID is a UUID-formatted string. If the serviceStatus
     *       is not Running, a null UUID is returned. The ID can also be an empty
     *       string in the case there is no current activity.
     */
    QString currentActivity() const;

    /*!
     * Returns the list of all existing activities
     *
     * \note If the serviceStatus is not Running, only a null activity will be
     *       returned.
     */
    QStringList activities() const;

    /*!
     * Returns status of the activities service
     */
    ServiceStatus serviceStatus();

Q_SIGNALS:
    /*!
     * This signal is emitted when the current activity is changed
     *
     * \a id id of the new current activity
     */
    void currentActivityChanged(const QString &id);

    /*!
     * This signal is emitted when the activity service goes online or offline,
     * or when the class manages to synchronize the data with the service.
     *
     * \a status new status of the service
     */
    void serviceStatusChanged(Consumer::ServiceStatus status);

    /*!
     * This signal is emitted when a new activity is added
     *
     * \a id id of the new activity
     */
    void activityAdded(const QString &id);

    /*!
     * This signal is emitted when an activity has been removed
     *
     * \a id id of the removed activity
     */
    void activityRemoved(const QString &id);

    /*!
     * This signal is emitted when the activity list changes
     *
     * \a activities list of activities
     */
    void activitiesChanged(const QStringList &activities);

private:
    const std::unique_ptr<ConsumerPrivate> d;
};

} // namespace KActivities

#endif // ACTIVITIES_CONSUMER_H
