// Copyright 2018 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/overlay/playback_image_button.h"

#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/browser/ui/views/overlay/constants.h"
#include "chrome/grit/generated_resources.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/models/image_model.h"
#include "ui/base/ui_base_features.h"
#include "ui/color/color_id.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/animation/ink_drop.h"
#include "ui/views/background.h"

namespace {

constexpr int kPlaybackButtonIconSize = 24;

}  // namespace

PlaybackImageButton::PlaybackImageButton(PressedCallback callback)
    : OverlayWindowImageButton(std::move(callback)) {
  SetSize(gfx::Size(kCenterButtonSize, kCenterButtonSize));

  // We use a solid background color in the UI, and that ends up sitting above
  // the ink drop layer, so we need to force the ink drop layer higher here.
  views::InkDrop::Get(this)->SetLayerRegion(views::LayerRegion::kAbove);

  play_image_ = ui::ImageModel::FromVectorIcon(
      features::IsRoundedIconsEnabled()
          ? vector_icons::kPlayArrowFilledFlippableIcon
          : vector_icons::kPlayArrowOldIcon,
      ui::kColorSysOnSecondaryContainer, kPlaybackButtonIconSize);
  pause_image_ = ui::ImageModel::FromVectorIcon(
      features::IsRoundedIconsEnabled() ? vector_icons::kPauseFilledIcon
                                        : vector_icons::kPauseOldIcon,
      kColorPipWindowForeground, kPlaybackButtonIconSize);
  replay_image_ = ui::ImageModel::FromVectorIcon(
      features::IsRoundedIconsEnabled() ? vector_icons::kReplayIcon
                                        : vector_icons::kReplayOldIcon,
      kColorPipWindowForeground, kPlaybackButtonIconSize);

  UpdateImageAndText();

  // Accessibility.
  const std::u16string playback_accessible_button_label(
      l10n_util::GetStringUTF16(
          IDS_PICTURE_IN_PICTURE_PLAY_PAUSE_CONTROL_ACCESSIBLE_TEXT));
  GetViewAccessibility().SetName(playback_accessible_button_label);
}

void PlaybackImageButton::SetPlaybackState(
    const VideoOverlayWindowViews::PlaybackState playback_state) {
  if (playback_state_ == playback_state) {
    return;
  }

  playback_state_ = playback_state;
  UpdateImageAndText();
}

void PlaybackImageButton::UpdateImageAndText() {
  switch (playback_state_) {
    case VideoOverlayWindowViews::kPlaying: {
      SetImageModel(views::Button::STATE_NORMAL, pause_image_);
      SetPauseButtonBackground();
      std::u16string pause_text =
          l10n_util::GetStringUTF16(IDS_PICTURE_IN_PICTURE_PAUSE_CONTROL_TEXT);
      SetTooltipText(pause_text);
      GetViewAccessibility().SetName(pause_text);
      break;
    }
    case VideoOverlayWindowViews::kPaused: {
      SetImageModel(views::Button::STATE_NORMAL, play_image_);
      SetPlayButtonBackground();
      std::u16string play_text =
          l10n_util::GetStringUTF16(IDS_PICTURE_IN_PICTURE_PLAY_CONTROL_TEXT);
      SetTooltipText(play_text);
      GetViewAccessibility().SetName(play_text);
      break;
    }
    case VideoOverlayWindowViews::kEndOfVideo: {
      SetImageModel(views::Button::STATE_NORMAL, replay_image_);
      SetPauseButtonBackground();
      std::u16string replay_text =
          l10n_util::GetStringUTF16(IDS_PICTURE_IN_PICTURE_REPLAY_CONTROL_TEXT);
      SetTooltipText(replay_text);
      GetViewAccessibility().SetName(replay_text);
      break;
    }
  }

  SchedulePaint();
}

void PlaybackImageButton::SetPlayButtonBackground() {
  SetBackground(views::CreateRoundedRectBackground(
      ui::kColorSysSecondaryContainer, kCenterButtonSize / 2));
}

void PlaybackImageButton::SetPauseButtonBackground() {
  SetBackground(views::CreateRoundedRectBackground(
      SkColorSetARGB(0x33, 0xFF, 0xFF, 0xFF), kCenterButtonSize / 2));
}

BEGIN_METADATA(PlaybackImageButton)
END_METADATA
