/******************************************************************************
 * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN
 */

#pragma once

#include <Quotient/events/roomevent.h>
#include <Quotient/events/stateevent.h>
#include <Quotient/jobs/basejob.h>

namespace Quotient {

/*! \brief Get events and state around the specified event.
 *
 * This API returns a number of events that happened just before and
 * after the specified event. This allows clients to get the context
 * surrounding an event.
 *
 * *Note*: This endpoint supports lazy-loading of room member events. See
 * [Lazy-loading room members](/client-server-api/#lazy-loading-room-members)
 * for more information.
 */
class QUOTIENT_API GetEventContextJob : public BaseJob {
public:
    /*! \brief Get events and state around the specified event.
     *
     * \param roomId
     *   The room to get events from.
     *
     * \param eventId
     *   The event to get context around.
     *
     * \param limit
     *   The maximum number of context events to return. The limit applies
     *   to the sum of the `events_before` and `events_after` arrays. The
     *   requested event ID is always returned in `event` even if `limit` is
     *   0. Defaults to 10.
     *
     * \param filter
     *   A JSON `RoomEventFilter` to filter the returned events with. The
     *   filter is only applied to `events_before`, `events_after`, and
     *   `state`. It is not applied to the `event` itself. The filter may
     *   be applied before or/and after the `limit` parameter - whichever the
     *   homeserver prefers.
     *
     *   See [Filtering](/client-server-api/#filtering) for more information.
     */
    explicit GetEventContextJob(const QString& roomId, const QString& eventId,
                                Omittable<int> limit = none,
                                const QString& filter = {});

    /*! \brief Construct a URL without creating a full-fledged job object
     *
     * This function can be used when a URL for GetEventContextJob
     * is necessary but the job itself isn't.
     */
    static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId,
                               const QString& eventId,
                               Omittable<int> limit = none,
                               const QString& filter = {});

    // Result properties

    /// A token that can be used to paginate backwards with.
    QString begin() const { return loadFromJson<QString>("start"_ls); }

    /// A token that can be used to paginate forwards with.
    QString end() const { return loadFromJson<QString>("end"_ls); }

    /// A list of room events that happened just before the
    /// requested event, in reverse-chronological order.
    RoomEvents eventsBefore()
    {
        return takeFromJson<RoomEvents>("events_before"_ls);
    }

    /// Details of the requested event.
    RoomEventPtr event() { return takeFromJson<RoomEventPtr>("event"_ls); }

    /// A list of room events that happened just after the
    /// requested event, in chronological order.
    RoomEvents eventsAfter()
    {
        return takeFromJson<RoomEvents>("events_after"_ls);
    }

    /// The state of the room at the last event returned.
    StateEvents state() { return takeFromJson<StateEvents>("state"_ls); }
};

} // namespace Quotient
