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

#include "base/feature_list.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/accessibility/live_translate_controller_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/live_caption/live_translate_controller.h"
#include "components/live_caption/pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/sync_preferences/pref_service_syncable.h"
#include "content/public/test/browser_test.h"
#include "media/base/media_switches.h"

namespace captions {

class LiveTranslateControllerTest : public InProcessBrowserTest {
 public:
  LiveTranslateControllerTest() = default;
  LiveTranslateControllerTest(const LiveTranslateControllerTest&) = delete;
  LiveTranslateControllerTest& operator=(const LiveTranslateControllerTest&) =
      delete;
  ~LiveTranslateControllerTest() override = default;

  void SetUp() override {
    scoped_feature_list_.InitWithFeatures({media::kLiveTranslate}, {});
    InProcessBrowserTest::SetUp();
  }

  LiveTranslateController* GetControllerForProfile(Profile* profile) {
    return LiveTranslateControllerFactory::GetForProfile(profile);
  }

  void SetLiveCaptionEnabled(bool enabled) {
    browser()->profile()->GetPrefs()->SetBoolean(prefs::kLiveCaptionEnabled,
                                                 enabled);
  }

  bool GetLiveCaptionEnabled() {
    return browser()->profile()->GetPrefs()->GetBoolean(
        prefs::kLiveCaptionEnabled);
  }

  void SetLiveTranslateEnabled(bool enabled) {
    browser()->profile()->GetPrefs()->SetBoolean(prefs::kLiveTranslateEnabled,
                                                 enabled);
  }

  bool GetLiveTranslateEnabled() {
    return browser()->profile()->GetPrefs()->GetBoolean(
        prefs::kLiveTranslateEnabled);
  }

 private:
  base::test::ScopedFeatureList scoped_feature_list_;
};

IN_PROC_BROWSER_TEST_F(LiveTranslateControllerTest,
                       LiveTranslateEnableChanged) {
  EXPECT_FALSE(GetLiveCaptionEnabled());
  EXPECT_FALSE(GetLiveTranslateEnabled());

  SetLiveCaptionEnabled(true);
  EXPECT_TRUE(GetLiveCaptionEnabled());
  EXPECT_FALSE(GetLiveTranslateEnabled());

  SetLiveTranslateEnabled(true);
  EXPECT_TRUE(GetLiveCaptionEnabled());
  EXPECT_TRUE(GetLiveTranslateEnabled());

  // Turning off Live Caption should automatically turn off Live Translate.
  SetLiveCaptionEnabled(false);
  EXPECT_FALSE(GetLiveCaptionEnabled());
  EXPECT_FALSE(GetLiveTranslateEnabled());

  // Turning on Live Translate should automatically turn on Live Caption.
  SetLiveTranslateEnabled(true);
  EXPECT_TRUE(GetLiveCaptionEnabled());
  EXPECT_TRUE(GetLiveTranslateEnabled());

  // Turning off Live Translate should not turn off Live Caption.
  SetLiveTranslateEnabled(false);
  EXPECT_TRUE(GetLiveCaptionEnabled());
  EXPECT_FALSE(GetLiveTranslateEnabled());
}

}  // namespace captions
