// Copyright 2019 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/ui/views/profiles/incognito_menu_view.h"

#include <string>
#include <utility>

#include "base/functional/bind.h"
#include "base/metrics/user_metrics.h"
#include "build/build_config.h"
#include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/lifetime/application_lifetime_desktop.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_window/public/profile_browser_collection.h"
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/grit/generated_resources.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/image_model.h"
#include "ui/base/ui_base_features.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/bubble/bubble_anchor.h"

IncognitoMenuView::IncognitoMenuView(views::BubbleAnchor anchor_element,
                                     BrowserWindowInterface* browser)
    : ProfileMenuViewBase(anchor_element, browser) {
  CHECK(profile().IsIncognitoProfile());
  GetViewAccessibility().SetName(GetAccessibleWindowTitle(),
                                 ax::mojom::NameFrom::kAttribute);

  base::RecordAction(base::UserMetricsAction("IncognitoMenu_Show"));
}

IncognitoMenuView::~IncognitoMenuView() = default;

void IncognitoMenuView::BuildMenu() {
  int incognito_window_count =
      static_cast<int>(ProfileBrowserCollection::GetForProfile(&profile())
                           ->GetOffTheRecordBrowserCount());
  std::u16string close_button_title = l10n_util::GetPluralStringFUTF16(
      IDS_INCOGNITO_PROFILE_MENU_CLOSE_X_WINDOWS_BUTTON,
      incognito_window_count);
  IdentitySectionParams params;
  params.title = l10n_util::GetStringUTF16(IDS_INCOGNITO_PROFILE_MENU_TITLE);

  // Padded icon.
  params.profile_image_padding = std::nearbyint(kIdentityInfoImageSize * 0.25f);
  params.profile_image = ui::ImageModel::FromVectorIcon(
      features::IsRoundedIconsEnabled() ? kIncognitoIcon
                                        : kIncognitoRefreshMenuOldIcon,
      kColorAvatarButtonHighlightIncognitoForeground,
      kIdentityInfoImageSize - 2 * params.profile_image_padding);
  SetProfileIdentityWithCallToAction(std::move(params));
  AddBottomMargin();

  const float icon_to_image_ratio =
      features::IsRoundedIconsEnabled() ? 1.3 : 1.0;
  AddFeatureButton(close_button_title,
                   base::BindRepeating(&IncognitoMenuView::OnExitButtonClicked,
                                       base::Unretained(this)),
                   features::IsRoundedIconsEnabled()
                       ? vector_icons::kCloseIcon
                       : vector_icons::kCloseOldIcon,
                   icon_to_image_ratio);
}

std::u16string IncognitoMenuView::GetAccessibleWindowTitle() const {
  return l10n_util::GetPluralStringFUTF16(
      IDS_INCOGNITO_BUBBLE_ACCESSIBLE_TITLE,
      static_cast<int>(ProfileBrowserCollection::GetForProfile(&profile())
                           ->GetOffTheRecordBrowserCount()));
}

void IncognitoMenuView::OnExitButtonClicked() {
  OnActionableItemClicked(ActionableItem::kExitProfileButton);
  base::RecordAction(base::UserMetricsAction("IncognitoMenu_ExitClicked"));
  // Skipping before-unload trigger to give incognito mode users a chance to
  // quickly close all incognito windows without needing to confirm closing the
  // open forms.
  chrome::CloseAllBrowsersWithIncognitoProfile(&profile());
}
