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

#include "chrome/browser/extensions/browsertest_util.h"

#include <memory>

#include "base/feature_list.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/apps/app_service/app_launch_params.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/apps/app_service/browser_app_launcher.h"
#include "chrome/browser/extensions/launch_util.h"
#include "chrome/browser/extensions/window_controller.h"
#include "chrome/browser/extensions/window_controller_list.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/web_applications/web_app_helpers.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/services/app_service/public/cpp/app_launch_util.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"

#if BUILDFLAG(IS_CHROMEOS)
#include "ash/constants/ash_paths.h"
#include "chrome/browser/extensions/updater/local_extension_cache.h"
#endif

namespace extensions::browsertest_util {

#if BUILDFLAG(IS_CHROMEOS)
void CreateAndInitializeLocalCache() {
  base::FilePath extension_cache_dir;
  CHECK(base::PathService::Get(ash::DIR_DEVICE_EXTENSION_LOCAL_CACHE,
                               &extension_cache_dir));
  base::FilePath cache_init_file = extension_cache_dir.Append(
      extensions::LocalExtensionCache::kCacheReadyFlagFileName);
  EXPECT_TRUE(base::WriteFile(cache_init_file, ""));
}
#endif

Browser* LaunchAppBrowser(Profile* profile, const Extension* extension_app) {
  ui_test_utils::BrowserChangeObserver browser_change_observer(
      /*browser=*/nullptr,
      ui_test_utils::BrowserChangeObserver::ChangeType::kAdded);

  EXPECT_TRUE(apps::AppServiceProxyFactory::GetForProfile(profile)
                  ->BrowserAppLauncher()
                  ->LaunchAppWithParamsForTesting(apps::AppLaunchParams(
                      extension_app->id(),
                      apps::LaunchContainer::kLaunchContainerWindow,
                      WindowOpenDisposition::CURRENT_TAB,
                      apps::LaunchSource::kFromTest)));

  Browser* const browser = browser_change_observer.Wait();
  DCHECK(browser);
  EXPECT_EQ(web_app::GetAppIdFromApplicationName(browser->app_name()),
            extension_app->id());
  return browser;
}

content::WebContents* AddTab(Browser* browser, const GURL& url) {
  int starting_tab_count = browser->tab_strip_model()->count();
  ui_test_utils::NavigateToURLWithDisposition(
      browser, url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
      ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
  int tab_count = browser->tab_strip_model()->count();
  EXPECT_EQ(starting_tab_count + 1, tab_count);
  return browser->tab_strip_model()->GetActiveWebContents();
}

size_t GetWindowControllerCountInProfile(Profile* profile) {
  size_t count = 0;
  for (WindowController* window : *WindowControllerList::GetInstance()) {
    if (window->profile() == profile) {
      count++;
    }
  }
  return count;
}

}  // namespace extensions::browsertest_util
