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

#include <memory>
#include <string>

#include "base/run_loop.h"
#include "chrome/browser/media/router/test/mock_media_router.h"
#include "chrome/browser/ui/toolbar/media_router_action_controller.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "testing/gmock/include/gmock/gmock.h"

class FakeCastToolbarIcon : public MediaRouterActionController::Observer {
 public:
  FakeCastToolbarIcon() = default;
  ~FakeCastToolbarIcon() override = default;

  void ShowIcon() override { icon_shown_ = true; }

  void HideIcon() override { icon_shown_ = false; }

  void ActivateIcon() override {}
  void DeactivateIcon() override {}

  bool IsShown() const { return icon_shown_; }

 private:
  bool icon_shown_ = false;
};

class MediaRouterActionControllerUnitTest : public BrowserWithTestWindowTest {
 public:
  MediaRouterActionControllerUnitTest()
      : issue_(media_router::IssueInfo(
            "title notification",
            media_router::IssueInfo::Action::DISMISS,
            media_router::IssueInfo::Severity::NOTIFICATION)),
        source1_("fakeSource1"),
        source2_("fakeSource2") {}

  ~MediaRouterActionControllerUnitTest() override {}

  void SetUp() override {
    BrowserWithTestWindowTest::SetUp();

    router_ = std::make_unique<media_router::MockMediaRouter>();
    controller_ =
        std::make_unique<MediaRouterActionController>(profile(), router_.get());
    controller_->AddObserver(&icon_);

    SetAlwaysShowActionPref(false);

    local_display_route_list_.push_back(media_router::MediaRoute(
        "routeId1", source1_, "sinkId1", "description", true, true));
    non_local_display_route_list_.push_back(media_router::MediaRoute(
        "routeId2", source1_, "sinkId2", "description", false, true));
    non_local_display_route_list_.push_back(media_router::MediaRoute(
        "routeId3", source2_, "sinkId3", "description", true, false));
  }

  void TearDown() override {
    controller_.reset();
    router_.reset();
    BrowserWithTestWindowTest::TearDown();
  }

  bool IsIconShown() const {
    base::RunLoop().RunUntilIdle();
    return icon_.IsShown();
  }

  void SetAlwaysShowActionPref(bool always_show) {
    MediaRouterActionController::SetAlwaysShowActionPref(profile(),
                                                         always_show);
  }

 protected:
  std::unique_ptr<MediaRouterActionController> controller_;
  std::unique_ptr<media_router::MockMediaRouter> router_;
  FakeCastToolbarIcon icon_;

  const media_router::Issue issue_;

  // Fake Sources, used for the Routes.
  const media_router::MediaSource source1_;
  const media_router::MediaSource source2_;

  std::vector<media_router::MediaRoute> local_display_route_list_;
  std::vector<media_router::MediaRoute> non_local_display_route_list_;
  std::vector<media_router::MediaRoute::Id> empty_route_id_list_;

  DISALLOW_COPY_AND_ASSIGN(MediaRouterActionControllerUnitTest);
};

TEST_F(MediaRouterActionControllerUnitTest, EphemeralIconForRoutesAndIssues) {
  EXPECT_FALSE(IsIconShown());

  // Creating a local route should show the action icon.
  controller_->OnRoutesUpdated(local_display_route_list_, empty_route_id_list_);
  EXPECT_TRUE(controller_->has_local_display_route_);
  EXPECT_TRUE(IsIconShown());
  // Removing the local route should hide the icon.
  controller_->OnRoutesUpdated(non_local_display_route_list_,
                               empty_route_id_list_);
  EXPECT_FALSE(controller_->has_local_display_route_);
  EXPECT_FALSE(IsIconShown());

  // Creating an issue should show the action icon.
  controller_->OnIssue(issue_);
  EXPECT_TRUE(controller_->has_issue_);
  EXPECT_TRUE(IsIconShown());
  // Removing the issue should hide the icon.
  controller_->OnIssuesCleared();
  EXPECT_FALSE(controller_->has_issue_);
  EXPECT_FALSE(IsIconShown());

  controller_->OnIssue(issue_);
  controller_->OnRoutesUpdated(local_display_route_list_, empty_route_id_list_);
  controller_->OnIssuesCleared();
  // When the issue disappears, the icon should remain visible if there's
  // a local route.
  EXPECT_TRUE(IsIconShown());
  controller_->OnRoutesUpdated(std::vector<media_router::MediaRoute>(),
                               empty_route_id_list_);
  EXPECT_FALSE(IsIconShown());
}

TEST_F(MediaRouterActionControllerUnitTest, EphemeralIconForDialog) {
  EXPECT_FALSE(IsIconShown());

  // Showing a dialog should show the icon.
  controller_->OnDialogShown();
  EXPECT_TRUE(IsIconShown());
  // Showing and hiding a dialog shouldn't hide the icon as long as we have a
  // positive number of dialogs.
  controller_->OnDialogShown();
  EXPECT_TRUE(IsIconShown());
  controller_->OnDialogHidden();
  EXPECT_TRUE(IsIconShown());
  // When we have zero dialogs, the icon should be hidden.
  controller_->OnDialogHidden();
  EXPECT_FALSE(IsIconShown());

  controller_->OnDialogShown();
  EXPECT_TRUE(IsIconShown());
  controller_->OnRoutesUpdated(local_display_route_list_, empty_route_id_list_);
  // Hiding the dialog while there are local routes shouldn't hide the icon.
  controller_->OnDialogHidden();
  EXPECT_TRUE(IsIconShown());
  controller_->OnRoutesUpdated(non_local_display_route_list_,
                               empty_route_id_list_);
  EXPECT_FALSE(IsIconShown());

  controller_->OnDialogShown();
  EXPECT_TRUE(IsIconShown());
  controller_->OnIssue(issue_);
  // Hiding the dialog while there is an issue shouldn't hide the icon.
  controller_->OnDialogHidden();
  EXPECT_TRUE(IsIconShown());
  controller_->OnIssuesCleared();
  EXPECT_FALSE(IsIconShown());
}

TEST_F(MediaRouterActionControllerUnitTest, EphemeralIconForContextMenu) {
  EXPECT_FALSE(IsIconShown());

  controller_->OnDialogShown();
  EXPECT_TRUE(IsIconShown());
  controller_->OnDialogHidden();
  controller_->OnContextMenuShown();
  // Hiding the dialog immediately before showing a context menu shouldn't hide
  // the icon.
  EXPECT_TRUE(IsIconShown());

  // Hiding the context menu should hide the icon.
  controller_->OnContextMenuHidden();
  EXPECT_FALSE(IsIconShown());
}

TEST_F(MediaRouterActionControllerUnitTest, ObserveAlwaysShowPrefChange) {
  EXPECT_FALSE(IsIconShown());

  SetAlwaysShowActionPref(true);
  EXPECT_TRUE(IsIconShown());

  controller_->OnRoutesUpdated(local_display_route_list_, empty_route_id_list_);
  SetAlwaysShowActionPref(false);
  // Unchecking the option while having a local route shouldn't hide the icon.
  EXPECT_TRUE(IsIconShown());

  SetAlwaysShowActionPref(true);
  controller_->OnRoutesUpdated(non_local_display_route_list_,
                               empty_route_id_list_);
  // Removing the local route should not hide the icon.
  EXPECT_TRUE(IsIconShown());

  SetAlwaysShowActionPref(false);
  EXPECT_FALSE(IsIconShown());
}
