// Copyright 2018 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/views/autofill/local_card_migration_error_dialog_view.h"

#include "base/macros.h"
#include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/ui/autofill/local_card_migration_dialog_factory.h"
#include "chrome/browser/ui/autofill/popup_constants.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/chrome_typography.h"
#include "components/autofill/core/browser/local_card_migration_manager.h"
#include "components/constrained_window/constrained_window_views.h"
#include "components/grit/components_scaled_resources.h"
#include "components/strings/grit/components_strings.h"
#include "components/web_modal/web_contents_modal_dialog_host.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/style/typography.h"
#include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_client_view.h"

namespace autofill {

LocalCardMigrationErrorDialogView::LocalCardMigrationErrorDialogView(
    LocalCardMigrationDialogController* controller,
    content::WebContents* web_contents)
    : controller_(controller), web_contents_(web_contents) {
  set_close_on_deactivate(false);
  set_margins(gfx::Insets());
}

LocalCardMigrationErrorDialogView::~LocalCardMigrationErrorDialogView() {}

void LocalCardMigrationErrorDialogView::ShowDialog() {
  Init();
  constrained_window::CreateBrowserModalDialogViews(
      this, web_contents_->GetTopLevelNativeWindow())
      ->Show();
}

void LocalCardMigrationErrorDialogView::CloseDialog() {
  controller_ = nullptr;
  GetWidget()->Close();
}

gfx::Size LocalCardMigrationErrorDialogView::CalculatePreferredSize() const {
  const int width = ChromeLayoutProvider::Get()->GetDistanceMetric(
                        DISTANCE_LARGE_MODAL_DIALOG_PREFERRED_WIDTH) -
                    margins().width();
  return gfx::Size(width, GetHeightForWidth(width));
}

ui::ModalType LocalCardMigrationErrorDialogView::GetModalType() const {
  // The error dialog should be a modal dialog blocking the whole browser
  // which is consistent with other dialogs. It should make sure that the
  // user can see the error message.
  return ui::MODAL_TYPE_WINDOW;
}

bool LocalCardMigrationErrorDialogView::ShouldShowCloseButton() const {
  return false;
}

int LocalCardMigrationErrorDialogView::GetDialogButtons() const {
  return ui::DIALOG_BUTTON_CANCEL;
}

void LocalCardMigrationErrorDialogView::WindowClosing() {
  if (controller_) {
    controller_->OnDialogClosed();
    controller_ = nullptr;
  }
}

bool LocalCardMigrationErrorDialogView::Cancel() {
  controller_->OnDoneButtonClicked();
  return true;
}

bool LocalCardMigrationErrorDialogView::Close() {
  // Close the dialog if the user exits the browser when dialog is visible.
  return true;
}

void LocalCardMigrationErrorDialogView::Init() {
  if (has_children())
    return;

  ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
  SetLayoutManager(std::make_unique<views::BoxLayout>(
      views::BoxLayout::kVertical, gfx::Insets(),
      kMigrationDialogMainContainerChildSpacing));
  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();

  auto* image = new views::ImageView();
  image->SetImage(rb.GetImageSkiaNamed(IDR_AUTOFILL_MIGRATION_DIALOG_HEADER));
  image->SetAccessibleName(
      l10n_util::GetStringUTF16(IDS_AUTOFILL_GOOGLE_PAY_LOGO_ACCESSIBLE_NAME));
  AddChildView(image);

  auto* error_view = new views::View();
  auto* horizontal_layout =
      error_view->SetLayoutManager(std::make_unique<views::BoxLayout>(
          views::BoxLayout::kHorizontal, gfx::Insets(),
          provider->GetDistanceMetric(
              views::DISTANCE_UNRELATED_CONTROL_VERTICAL)));
  horizontal_layout->set_main_axis_alignment(
      views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
  error_view->SetBorder(views::CreateEmptyBorder(kMigrationDialogInsets));
  auto* error_image = new views::ImageView();
  error_image->SetImage(
      gfx::CreateVectorIcon(kBrowserToolsErrorIcon, gfx::kGoogleRed700));
  error_view->AddChildView(error_image);

  auto* error_message = new views::Label(
      l10n_util::GetPluralStringFUTF16(
          IDS_AUTOFILL_LOCAL_CARD_MIGRATION_DIALOG_MESSAGE_ERROR,
          controller_->GetCardList().size()),
      CONTEXT_BODY_TEXT_LARGE, ChromeTextStyle::STYLE_RED);
  error_view->AddChildView(error_message);

  AddChildView(error_view);
}

LocalCardMigrationDialog* CreateLocalCardMigrationErrorDialogView(
    LocalCardMigrationDialogController* controller,
    content::WebContents* web_contents) {
  return new LocalCardMigrationErrorDialogView(controller, web_contents);
}

}  // namespace autofill
