// 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 "chrome/browser/ui/webui/signin/signin_utils.h"

#include <set>

#include "base/bind.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_finder.h"
#include "components/guest_view/browser/guest_view_manager.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"

namespace {

bool AddWebContentsToSet(std::set<content::WebContents*>* frame_set,
                         const std::string& web_view_name,
                         content::WebContents* web_contents) {
  auto* web_view = extensions::WebViewGuest::FromWebContents(web_contents);
  if (web_view && web_view->name() == web_view_name)
    frame_set->insert(web_contents);
  return false;
}

}  // namespace

namespace signin {

content::RenderFrameHost* GetAuthFrame(content::WebContents* web_contents,
                                       const std::string& parent_frame_name) {
  content::WebContents* auth_web_contents =
      GetAuthFrameWebContents(web_contents, parent_frame_name);
  return auth_web_contents ? auth_web_contents->GetMainFrame() : nullptr;
}

content::WebContents* GetAuthFrameWebContents(
    content::WebContents* web_contents,
    const std::string& parent_frame_name) {
  std::set<content::WebContents*> frame_set;
  auto* manager = guest_view::GuestViewManager::FromBrowserContext(
      web_contents->GetBrowserContext());
  if (manager) {
    manager->ForEachGuest(web_contents,
                          base::BindRepeating(&AddWebContentsToSet, &frame_set,
                                              parent_frame_name));
  }
  DCHECK_GE(1U, frame_set.size());
  if (!frame_set.empty())
    return *frame_set.begin();

  return nullptr;
}

Browser* GetDesktopBrowser(content::WebUI* web_ui) {
  Browser* browser =
      chrome::FindBrowserWithWebContents(web_ui->GetWebContents());
  if (!browser)
    browser = chrome::FindLastActiveWithProfile(Profile::FromWebUI(web_ui));
  return browser;
}

void SetInitializedModalHeight(Browser* browser,
                               content::WebUI* web_ui,
                               const base::ListValue* args) {
#if defined(OS_CHROMEOS)
  NOTREACHED();
#else
  if (!browser)
    return;

  double height;
  const bool success = args->GetDouble(0, &height);
  DCHECK(success);
  browser->signin_view_controller()->SetModalSigninHeight(
      static_cast<int>(height));
#endif
}
}  // namespace signin
