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

#include "components/live_caption/live_caption_bubble_settings.h"

#include "base/i18n/language_tag.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "components/live_caption/caption_bubble_settings.h"
#include "components/live_caption/pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace captions {
namespace {

constexpr char kArabicLanguage[] = "ar-EG";
constexpr char kEnglishLanguage[] = "en-US";

class MockObserver : public CaptionBubbleSettings::Observer {
 public:
  MockObserver() = default;
  ~MockObserver() override = default;
  MOCK_METHOD(void, OnLiveTranslateEnabledChanged, (), (override));
  MOCK_METHOD(void, OnLiveCaptionLanguageChanged, (), (override));
  MOCK_METHOD(void, OnLiveTranslateTargetLanguageChanged, (), (override));
};

class LiveCaptionBubbleSettingsTest : public testing::Test {
 protected:
  void SetUp() override {
    pref_service_.registry()->RegisterBooleanPref(
        prefs::kLiveCaptionBubbleExpanded, false);
    pref_service_.registry()->RegisterBooleanPref(prefs::kLiveTranslateEnabled,
                                                  false);
    pref_service_.registry()->RegisterBooleanPref(prefs::kLiveCaptionEnabled,
                                                  false);
    pref_service_.registry()->RegisterStringPref(
        prefs::kLiveCaptionLanguageCode, kEnglishLanguage);
    pref_service_.registry()->RegisterLanguageTagPref(
        prefs::kLiveTranslateTargetLanguageCode,
        base::i18n::GetKnownLanguageTag("en"));
  }

  TestingPrefServiceSimple pref_service_;
  MockObserver observer_;
  base::WeakPtrFactory<MockObserver> observer_weak_ptr_factory_{&observer_};
};

TEST_F(LiveCaptionBubbleSettingsTest, SetLiveCaptionBubbleExpanded) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  caption_bubble_settings.SetLiveCaptionBubbleExpanded(true);

  EXPECT_TRUE(pref_service_.GetBoolean(prefs::kLiveCaptionBubbleExpanded));
}

TEST_F(LiveCaptionBubbleSettingsTest, SetLiveCaptionEnabled) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  caption_bubble_settings.SetLiveCaptionEnabled(true);

  EXPECT_TRUE(pref_service_.GetBoolean(prefs::kLiveCaptionEnabled));
}

TEST_F(LiveCaptionBubbleSettingsTest, SetLiveTranslateTargetLanguageCode) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  caption_bubble_settings.SetLiveTranslateTargetLanguageCode(
      base::i18n::GetKnownLanguageTag("ar"));

  EXPECT_EQ(
      pref_service_.GetLanguageTag(prefs::kLiveTranslateTargetLanguageCode),
      base::i18n::GetKnownLanguageTag("ar"));
}

TEST_F(LiveCaptionBubbleSettingsTest, GetLiveCaptionBubbleExpanded) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  pref_service_.SetUserPref(prefs::kLiveCaptionBubbleExpanded,
                            base::Value(true));

  EXPECT_TRUE(caption_bubble_settings.GetLiveCaptionBubbleExpanded());
}

TEST_F(LiveCaptionBubbleSettingsTest, GetLiveTranslateEnabled) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  caption_bubble_settings.SetObserver(observer_weak_ptr_factory_.GetWeakPtr());

  EXPECT_FALSE(caption_bubble_settings.GetLiveTranslateEnabled());

  EXPECT_CALL(observer_, OnLiveTranslateEnabledChanged).Times(1);
  pref_service_.SetUserPref(prefs::kLiveTranslateEnabled, base::Value(true));

  EXPECT_TRUE(caption_bubble_settings.GetLiveTranslateEnabled());
}

TEST_F(LiveCaptionBubbleSettingsTest, GetLiveCaptionLanguageCode) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  caption_bubble_settings.SetObserver(observer_weak_ptr_factory_.GetWeakPtr());

  EXPECT_THAT(caption_bubble_settings.GetLiveCaptionLanguageCode(),
              testing::StrEq(kEnglishLanguage));

  EXPECT_CALL(observer_, OnLiveCaptionLanguageChanged).Times(1);
  pref_service_.SetUserPref(prefs::kLiveCaptionLanguageCode,
                            base::Value(kArabicLanguage));

  EXPECT_THAT(caption_bubble_settings.GetLiveCaptionLanguageCode(),
              testing::StrEq(kArabicLanguage));
}

TEST_F(LiveCaptionBubbleSettingsTest, GetLiveTranslateTargetLanguageCode) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  caption_bubble_settings.SetObserver(observer_weak_ptr_factory_.GetWeakPtr());

  EXPECT_EQ(caption_bubble_settings.GetLiveTranslateTargetLanguageCode(),
            base::i18n::GetKnownLanguageTag("en"));

  EXPECT_CALL(observer_, OnLiveTranslateTargetLanguageChanged).Times(1);
  pref_service_.SetLanguageTag(prefs::kLiveTranslateTargetLanguageCode,
                               base::i18n::GetKnownLanguageTag("ar"));

  EXPECT_EQ(caption_bubble_settings.GetLiveTranslateTargetLanguageCode(),
            base::i18n::GetKnownLanguageTag("ar"));
}

TEST_F(LiveCaptionBubbleSettingsTest, RemoveObservation) {
  LiveCaptionBubbleSettings caption_bubble_settings(&pref_service_);
  caption_bubble_settings.SetObserver(observer_weak_ptr_factory_.GetWeakPtr());
  caption_bubble_settings.RemoveObserver();

  EXPECT_CALL(observer_, OnLiveTranslateEnabledChanged).Times(0);
  pref_service_.SetUserPref(prefs::kLiveTranslateEnabled, base::Value(true));
}

}  // namespace
}  // namespace captions
