// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Use the <code>chrome.autofillAssistantPrivate</code> API to interact with
// the Autofill Assistant execution engine. Access is restricted to a set of
// extensions part of an allowlist.
//
// The correct usage of this API is to to first call <code>create</code>, then
// add listeners for the Events and then call <code>start</code>.
// <code>onActionsChanged</code> will be called when actions become available
// and can be executed via <code>performAction</code>.
namespace autofillAssistantPrivate {
  // Success or error of a function call will be communicated by setting
  // chrome.runtime.lastError.
  callback VoidCallback = void ();

  dictionary ActionObject {
    // The name for the action.
    DOMString name;

    // |onActionsChanged| returns an array of ActionObjects. |index|
    // corresponds to the position in that array and is also the index to be
    // passed to |performAction|.
    long index;
  };

  interface Functions {
    // Creates the autofill assistant controller and cleans up and existing
    // controller if applicable.
    static void create(optional VoidCallback callback);

    // Starts the controller with the given parameters.
    static void start(any parameters, optional VoidCallback callback);

    // Performs an action.
    // |index|: The index into the |actions| array provided by
    //          |onActionsChanged|.
    static void performAction(
        long index, optional VoidCallback callback);

    // Set user data to configure collect data actions.
    static void provideUserData(optional VoidCallback callback);
  };

  interface Events {
    // Fires when the status message changed.
    //
    // |message| The new status of the autofill assistant controller.
    static void onStatusMessageChanged(DOMString message);

    // Fires when a set of actions has changed.
    //
    // |actions| The new list of available actions.
    static void onActionsChanged(ActionObject[] actions);
  };
};
