// 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.modular;

// Debug service provider interface that provides the ability to listen to
// the internal state of the suggestion service.
[Discoverable]
interface SuggestionDebug {
    1: WatchAskProposals(AskProposalListener listener);
    2: WatchInterruptionProposals(InterruptionProposalListener listener);
    3: WatchNextProposals(NextProposalListener listener);

    // Waits until Suggestion Engine has reached a steady state such that no
    // further activity will occur unless acted upon from the outside.
    4: WaitUntilIdle() -> ();
    // Calls |async::Loop::RunUntilIdle()|, which processes all immediately
    // available messages. Unlike |WaitUntilIdle|, this does not wait for
    // long-running delayed tasks.
    5: RunUntilIdle() -> ();
};

interface AskProposalListener {
    // Receives the current ask query and ranked proposals
    1: OnAskStart(string query, vector<ProposalSummary> proposals);
    // Receives notification of query completion or dismissal.
    // |selected_proposal| is null if query was dismissed
    2: OnProposalSelected(ProposalSummary? selected_proposal);
};

interface InterruptionProposalListener {
    // Receives updates to the current proposal list and rankings
    1: OnInterrupt(ProposalSummary interruption_proposal);
};

interface NextProposalListener {
    // Receives updates to the current proposal list and rankings
    1: OnNextUpdate(vector<ProposalSummary> proposals);
};

// This is necessary because a Proposal is not Clone-able, as CustomAction
// can contain an InterfaceHandle.
struct ProposalSummary {
    string id;
    string publisher_url;
    SuggestionDisplay display;
};
