// Copyright 2014 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_RENDERER_NET_NET_ERROR_PAGE_CONTROLLER_H_
#define CHROME_RENDERER_NET_NET_ERROR_PAGE_CONTROLLER_H_

#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/renderer/net/net_error_helper_core.h"
#include "gin/arguments.h"
#include "gin/wrappable.h"

namespace content {
class RenderFrame;
}

// This class makes various helper functions available to the
// error page loaded by NetErrorHelper.  It is bound to the JavaScript
// window.errorPageController object.
class NetErrorPageController : public gin::Wrappable<NetErrorPageController> {
 public:
  static gin::WrapperInfo kWrapperInfo;

  // Interface used to notify creator of user actions invoked on the error page.
  class Delegate {
   public:
    // Button press notification from error page.
    virtual void ButtonPressed(NetErrorHelperCore::Button button) = 0;

    // Called when a link with the given tracking ID is pressed.
    virtual void TrackClick(int tracking_id) = 0;

    // Called to open suggested offline content when it is pressed.
    virtual void LaunchOfflineItem(const std::string& id,
                                   const std::string& name_space) = 0;

    // Called to show all available offline content.
    virtual void LaunchDownloadsPage() = 0;

    // Schedules a request to save the page later. This is different from the
    // download button in that the page is only saved temporarily. This is used
    // only for the auto-fetch-on-net-error-page feature.
    virtual void SavePageForLater() = 0;

    // Cancels the request to save the page later. This cancels a previous call
    // to |SavePageForLater|, or the automatic request made when loading the
    // error page. This is used only for the auto-fetch-on-net-error-page
    // feature.
    virtual void CancelSavePage() = 0;

    // Called to signal the user tapped the button to change the visibility of
    // the offline content list.
    virtual void ListVisibilityChanged(bool is_visible) = 0;

    // Save a new high score for the easer egg game in the user's synced
    // preferences.
    virtual void UpdateEasterEggHighScore(int high_score) = 0;

    // Clear any high score for the easer egg game saved in the user's synced
    // preferences.
    virtual void ResetEasterEggHighScore() = 0;

   protected:
    Delegate();
    virtual ~Delegate();

    DISALLOW_COPY_AND_ASSIGN(Delegate);
  };

  // Will invoke methods on |delegate| in response to user actions taken on the
  // error page. May call delegate methods even after the page has been
  // navigated away from, so it is recommended consumers make sure the weak
  // pointers are destroyed in response to navigations.
  static void Install(content::RenderFrame* render_frame,
                      base::WeakPtr<Delegate> delegate);

 private:
  explicit NetErrorPageController(base::WeakPtr<Delegate> delegate);
  ~NetErrorPageController() override;

  // Execute a button click to download page later.
  bool DownloadButtonClick();

  // Execute a "Reload" button click.
  bool ReloadButtonClick();

  // Execute a "Details" button click.
  bool DetailsButtonClick();

  // Track easter egg plays and high scores.
  bool TrackEasterEgg();
  bool UpdateEasterEggHighScore(int high_score);
  bool ResetEasterEggHighScore();

  // Execute a "Diagnose Errors" button click.
  bool DiagnoseErrorsButtonClick();

  // Track "Show cached copy" button clicks.
  bool TrackCachedCopyButtonClick();

  // Track a click when the page has suggestions from the navigation correction
  // service.
  bool TrackClick(const gin::Arguments& args);

  // Used internally by other button click methods.
  bool ButtonClick(NetErrorHelperCore::Button button);

  void LaunchOfflineItem(gin::Arguments* args);
  void LaunchDownloadsPage();
  void SavePageForLater();
  void CancelSavePage();
  void ListVisibilityChanged(bool is_visible);

  // gin::WrappableBase
  gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
      v8::Isolate* isolate) override;

  base::WeakPtr<Delegate> delegate_;

  DISALLOW_COPY_AND_ASSIGN(NetErrorPageController);
};

#endif  // CHROME_RENDERER_NET_NET_ERROR_PAGE_CONTROLLER_H_
