// 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.
    ///
    /// `snpashot` may be empty if there was an issue generating the snpashot.
    GetSnapshot(GetSnapshotParameters params) -> (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(ImageEncoding encoding) -> (Screenshot? screenshot);
};

const uint32 MAX_NUM_ANNOTATIONS_PROVIDED = 64;

/// Parameters for the DataProvider::GetSnapshot() method.
table GetSnapshotParameters {
    /// 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: zx.duration collection_timeout_per_data;
};

/// Represents a snapshot.
///
/// 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.
resource table Snapshot {
    /// 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.).
    1: Attachment archive;

    /// 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: vector<Annotation>:MAX_NUM_ANNOTATIONS_PROVIDED annotations;
};

/// 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.
enum ImageEncoding {
    PNG = 0;
};

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

    // 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`.
    fuchsia.math.Size dimensions_in_px;
};
