// Copyright 2018 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.

#ifndef CHROME_BROWSER_AUTOFILL_MANUAL_FILLING_CONTROLLER_H_
#define CHROME_BROWSER_AUTOFILL_MANUAL_FILLING_CONTROLLER_H_

#include <memory>

#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "components/autofill/core/browser/accessory_sheet_data.h"
#include "components/autofill/core/common/filling_status.h"
#include "content/public/browser/web_contents_user_data.h"
#include "ui/gfx/image/image.h"

// Controller interface for the view that includes the keyboard accessory and
// the accessory sheet below it. Implementations of this interface create and
// own a ManualFillingViewInterface.
//
// The manual filling controller forwards requests from type-specific accessory
// controllers (Passwords and Autofill) to the view. The view notifies this
// controller about interactions (such as requesting to fill a password
// suggestion) and forwards the request to the corresponding type-specific
// accessory controller.
//
// This controller also implements the logic to show/hide the keyboard
// accessory.
//
// ManualFillingController::GetOrCreate() should be used
// by type-specific controllers to obtain an instance of this class for a given
// WebContents. There is only one instance per WebContents, which is created the
// first time |GetOrCreate()| is invoked.
//
// Usage example:
//   auto controller = ManualFillingController::GetOrCreate(web_contents);
//   DCHECK(controller);
//   controller->RefreshSuggestionsForField(...);
class ManualFillingController {
 public:
  // The controller checks if at least one of these sources needs the accessory
  // to be displayed. Only if neither needs the accessory, it will not show up.
  enum class FillingSource { AUTOFILL, PASSWORD_FALLBACKS };

  ManualFillingController() = default;
  virtual ~ManualFillingController() = default;

  // Returns a weak pointer to the unique ManualFillingController instance
  // associated with a WebContents. The first invocation creates an instance
  // and attaches it to the WebContents; the same instance is returned by all
  // future invocations for the same WebContents.
  static base::WeakPtr<ManualFillingController> GetOrCreate(
      content::WebContents* contents);

  // --------------------------------------------
  // Methods called by type-specific controllers.
  // --------------------------------------------

  // Forwards |accessory_sheet_data| to the view provided by a type-specific
  // controller to be shown on the accessory sheet. If a field lost focus,
  // |is_fillable| should be false.
  virtual void RefreshSuggestionsForField(
      bool is_fillable,
      const autofill::AccessorySheetData& accessory_sheet_data) = 0;

  // Completes a filling attempt by recording metrics, giving feedback to the
  // user and dismissing the accessory sheet.
  virtual void OnFilledIntoFocusedField(autofill::FillingStatus status) = 0;

  // Requests to show the accessory bar. The accessory will only be shown
  // when the keyboard becomes visible.
  virtual void ShowWhenKeyboardIsVisible(FillingSource source) = 0;

  // Requests to hide the accessory. This hides both the accessory sheet
  // (if open) and the accessory bar.
  virtual void Hide(FillingSource source) = 0;

  // Notifies the view that automatic password generation status changed.
  //
  // TODO(crbug.com/905669): This controller doesn't need to know about password
  // generation. Generalize this to send to the UI the information that an
  // action (given by an enum param) is available.
  virtual void OnAutomaticGenerationStatusChanged(bool available) = 0;

  // --------------------------
  // Methods called by UI code:
  // --------------------------

  // Called by the UI code to request that |text_to_fill| is to be filled into
  // the currently focused field. Forwards the request to a type-specific
  // accessory controller.
  virtual void OnFillingTriggered(bool is_password,
                                  const base::string16& text_to_fill) = 0;

  // Called by the UI code because a user triggered the |selected_option|,
  // such as "Manage passwords..."
  // TODO(crbug.com/905669): Replace the string param with an enum to indicate
  // the selected option.
  virtual void OnOptionSelected(
      const base::string16& selected_option) const = 0;

  // Called by the UI code to signal that the user requested password
  // generation. This should prompt a modal dialog with the generated password.
  //
  // TODO(crbug.com/905669): This controller doesn't need to know about password
  // generation. Generalize this to forward an action request from the UI to a
  // type-specific accessory controller.
  virtual void OnGenerationRequested() = 0;

  // Gets an icon for the currently focused frame and passes it to
  // |icon_callback|. The callback is invoked with an image unless an icon for
  // a new origin was called. In the latter case, the callback is dropped.
  // The callback is called with an |IsEmpty()| image if there is no favicon.
  //
  // TODO(crbug.com/905669): This controller doesn't need to know about
  // favicons. Generalize this to forward an icon requests from the UI to a
  // type-specific accessory controller.
  virtual void GetFavicon(
      int desired_size_in_pixel,
      base::OnceCallback<void(const gfx::Image&)> icon_callback) = 0;

  // -----------------
  // Member accessors:
  // -----------------

  // The web page view containing the focused field.
  virtual gfx::NativeView container_view() const = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(ManualFillingController);
};

#endif  // CHROME_BROWSER_AUTOFILL_MANUAL_FILLING_CONTROLLER_H_
