// Copyright 2017 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.ledger.internal;

using fuchsia.ledger;
using zx;

[Discoverable]
interface LedgerRepositoryDebug {
    // Returns the instances list in LedgerRepository.
    1: GetInstancesList() -> (vector<vector<uint8>> result);

    // Returns the debugging interface for the given |ledger_name|.
    2: GetLedgerDebug(vector<uint8> ledger_name, request<LedgerDebug> ledger_debug)
           -> (fuchsia.ledger.Status status);
};

interface LedgerDebug {
    // Returns the pages list in Ledger.
    1: GetPagesList() -> (vector<fuchsia.ledger.PageId> result);

    // Returns OK and binds the |page_debug| for the given |page_id|.
    // Returns PAGE_NOT_FOUND if |page_id| isn't found.
    2: GetPageDebug(fuchsia.ledger.PageId page_id, request<PageDebug> page_debug)
           -> (fuchsia.ledger.Status status);
};

interface PageDebug {
    // Returns OK and a list of the head commits IDs.
    1: GetHeadCommitsIds() -> (fuchsia.ledger.Status status, vector<CommitId> result);

    // Returns OK and creates a snapshot of the page, allowing the client app to read a
    // consistent view of the content of the page.
    2: GetSnapshot(CommitId commit_id, request<fuchsia.ledger.PageSnapshot> snapshot_request)
           -> (fuchsia.ledger.Status status);

    // Returns OK and the Commit struct filled for the given |commit_id|.
    3: GetCommit(CommitId commit_id) -> (fuchsia.ledger.Status status, Commit? commit);
};

struct CommitId {
    vector<uint8> id;
};

struct Commit {
    // The ID of this commit.
    CommitId commit_id;

    // The IDs of this commit parents.
    vector<CommitId> parents_ids;

    // The creation timestamp of this commit in nanoseconds since epoch.
    zx.time timestamp;

    // The generation timestamp of this commit (the number of commits to the root).
    int64 generation;
};
