// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.feedback;

using fuchsia.math;
using fuchsia.mem;
using zx;

/// Provides data useful to attach to feedback reports, e.g., a crash report filed by the system, a
/// user feedback report filed by a user or a bug report filed by a developer.
@discoverable
protocol DataProvider {
    /// Returns a snapshot of the device's state.
    ///
    /// `snapshot` may be empty if there was an issue generating the snapshot.
    GetSnapshot(resource struct {
        params GetSnapshotParameters;
    }) -> (resource struct {
        snapshot Snapshot;
    });

    /// Returns an image of the current view encoded in the provided `encoding`.
    ///
    /// `screenshot` may be null if the encoding is not supported, the device does not have a
    /// display, or there is not enough memory to allocate the screenshot image.
    ///
    /// The screenshot is provided separately from the snapshot as callers might want to block on
    /// this call before changing the view while collecting a snapshot in the background is fine.
    /// There are also a lot of clients that are not interested in the screenshot.
    GetScreenshot(struct {
        encoding ImageEncoding;
    }) -> (resource struct {
        screenshot box<Screenshot>;
    });

    /// Returns a set of annotations about the device's state.
    ///
    /// `annotations` may be empty if there was an issue collecting them.
    ///
    /// These are the same annotations as provided through GetSnapshot() - some clients only want
    /// the annotations while others want both the annotations and the snapshot and generating the
    /// snapshot can take significantly more time than collecting the annotations, e.g., logs are
    /// only part of the snapshot and not part of the annotations and can take some time.
    GetAnnotations(struct {
        params GetAnnotationsParameters;
    }) -> (struct {
        annotations Annotations;
    });
};

const MAX_NUM_ANNOTATIONS_PROVIDED uint32 = 64;

/// Parameters for the DataProvider::GetAnnotations() method.
type GetAnnotationsParameters = table {
    /// Annotations are collected in parallel from various places in the platform, each with a
    /// timeout.
    ///
    /// `collection_timeout_per_annotation` allows clients to control how much time is given to
    /// each annotation collection. It enables clients to get a partial set of annotations under a
    /// certain time.
    1: collection_timeout_per_annotation zx.duration;
};

/// Parameters for the DataProvider::GetSnapshot() method.
type GetSnapshotParameters = resource table {
    /// A snapshot aggregates various data from the platform (device uptime, logs, Inspect data,
    /// etc.) that are collected in parallel. Internally, each data collection is done within a
    /// timeout.
    ///
    /// `collection_timeout_per_data` allows clients to control how much time is given to each data
    /// collection. It enables clients to get a partial yet valid snapshot under a certain time.
    ///
    /// Note that this does not control how much total time the snapshot generation may take,
    /// which is by construction higher than `collection_timeout_per_data`, as clients can control
    /// the total time by using a timeout on the call to GetSnapshot() on their side.
    1: collection_timeout_per_data zx.duration;

    /// If set, the snapshot archive will be sent as a |fuchsia.io.File| over this channel instead
    /// of being set in the |archive| field in the |Snapshot| response. This is typically useful if
    /// the client is on the host and does not support VMOs.
    2: response_channel zx.handle:CHANNEL;
};

/// Annotations about the device's state.
///
/// Clients typically upload the data straight to servers. So the data comes in the form of
/// arbitrary key-value pairs that clients can directly forward to the servers.
type Annotations = table {
    /// A vector of key-value string pairs. Keys are guaranteed to be unique.
    1: annotations vector<Annotation>:MAX_NUM_ANNOTATIONS_PROVIDED;
};

/// Snapshot about the device's state.
///
/// Clients typically upload the data straight to servers. So the data comes in the form of
/// arbitrary key-value pairs that clients can directly forward to the servers.
type Snapshot = resource table {
    /// A <filename, ZIP archive> pair.
    ///
    /// The ZIP archive contains several files corresponding to the various data it collected from
    /// the platform. There is typically one file for all the annotations (device uptime, build
    /// version, etc.) and one file per attachment (logs, Inspect data, etc.).
    ///
    /// Not set if |response_channel| was set in the request.
    1: archive Attachment;

    /// A vector of key-value string pairs. Keys are guaranteed to be unique.
    ///
    /// While the annotations are included in the ZIP archive itself, some clients also want them
    /// separately to index or augment them so we provide them separately as well.
    2: annotations vector<Annotation>:MAX_NUM_ANNOTATIONS_PROVIDED;
};

/// The encoding used for the image.
///
/// Today, only PNG is supported, but in the future the screenshot could be
/// returned in other encodings if need arises.
type ImageEncoding = strict enum {
    PNG = 0;
};

/// An encoded image of the screen.
type Screenshot = resource struct {
    image fuchsia.mem.Buffer;

    // While all encoded images contain their dimensions in their headers, some
    // clients still expect to receive the width and height separately, so we
    // also provide it separately so clients don't need to decode `image`.
    dimensions_in_px fuchsia.math.Size;
};
