// 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 "ash/app_menu/notification_menu_header_view.h"

#include "ash/public/cpp/app_menu_constants.h"
#include "base/strings/string_number_conversions.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/border.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/menu/menu_config.h"

namespace ash {

namespace {

// Color of text in NotificationMenuHeaderView.
constexpr SkColor kNotificationHeaderTextColor =
    SkColorSetRGB(0X1A, 0x73, 0xE8);

// Line height of all text in the NotificationMenuHeaderView in dips.
constexpr int kNotificationHeaderLineHeight = 20;

}  // namespace

NotificationMenuHeaderView::NotificationMenuHeaderView() {
  SetBorder(views::CreateEmptyBorder(gfx::Insets(
      kNotificationVerticalPadding, kNotificationHorizontalPadding)));

  notification_title_ = new views::Label(
      base::string16(l10n_util::GetStringUTF16(
          IDS_MESSAGE_CENTER_NOTIFICATION_ACCESSIBLE_NAME_PLURAL)),
      {views::Label::GetDefaultFontList().DeriveWithSizeDelta(1)});
  notification_title_->SetEnabledColor(kNotificationHeaderTextColor);
  notification_title_->SetLineHeight(kNotificationHeaderLineHeight);
  AddChildView(notification_title_);

  counter_ = new views::Label(
      base::string16(),
      {views::Label::GetDefaultFontList().DeriveWithSizeDelta(1)});
  counter_->SetEnabledColor(kNotificationHeaderTextColor);
  counter_->SetLineHeight(kNotificationHeaderLineHeight);
  AddChildView(counter_);
}

NotificationMenuHeaderView::~NotificationMenuHeaderView() = default;

void NotificationMenuHeaderView::UpdateCounter(int number_of_notifications) {
  if (number_of_notifications_ == number_of_notifications)
    return;

  number_of_notifications_ = number_of_notifications;

  counter_->SetText(base::NumberToString16(number_of_notifications_));
}

gfx::Size NotificationMenuHeaderView::CalculatePreferredSize() const {
  return gfx::Size(
      views::MenuConfig::instance().touchable_menu_width,
      GetInsets().height() + notification_title_->GetPreferredSize().height());
}

void NotificationMenuHeaderView::Layout() {
  const gfx::Insets insets = GetInsets();

  const gfx::Size notification_title_preferred_size =
      notification_title_->GetPreferredSize();
  notification_title_->SetBounds(insets.left(), insets.top(),
                                 notification_title_preferred_size.width(),
                                 notification_title_preferred_size.height());

  const gfx::Size counter_preferred_size = counter_->GetPreferredSize();
  counter_->SetBounds(width() - counter_preferred_size.width() - insets.right(),
                      insets.top(), counter_preferred_size.width(),
                      counter_preferred_size.height());
}

}  // namespace ash
