// 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 "ash/system/tracing_notification_controller.h"

#include "ash/constants/notifier_catalogs.h"
#include "ash/public/cpp/notification_utils.h"
#include "ash/public/cpp/system_tray_client.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/system/model/system_tray_model.h"
#include "base/functional/bind.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/message_center/message_center.h"
#include "ui/message_center/public/cpp/notification.h"

using message_center::MessageCenter;
using message_center::Notification;

namespace ash {

namespace {

const char kNotifierId[] = "ash.tracing";

void HandleNotificationClick() {
  Shell::Get()->system_tray_model()->client()->ShowChromeSlow();
}

}  // namespace

// static
const char TracingNotificationController::kNotificationId[] = "chrome://slow";

TracingNotificationController::TracingNotificationController()
    : model_(Shell::Get()->system_tray_model()->tracing()) {
  model_->AddObserver(this);
  OnTracingModeChanged();
}

TracingNotificationController::~TracingNotificationController() {
  model_->RemoveObserver(this);
}

void TracingNotificationController::OnTracingModeChanged() {
  // Return if the state doesn't change.
  if (was_tracing_ == model_->is_tracing())
    return;

  if (model_->is_tracing())
    CreateNotification();
  else
    RemoveNotification();

  was_tracing_ = model_->is_tracing();
}

void TracingNotificationController::CreateNotification() {
  std::unique_ptr<Notification> notification = CreateSystemNotificationPtr(
      message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId,
      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_TRACING_NOTIFICATION_TITLE),
      l10n_util::GetStringUTF16(
          IDS_ASH_STATUS_TRAY_TRACING_NOTIFICATION_MESSAGE),
      std::u16string() /* display_source */, GURL(),
      message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT,
                                 kNotifierId,
                                 NotificationCatalogName::kTracing),
      message_center::RichNotificationData(),
      base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
          base::BindRepeating(&HandleNotificationClick)),
      kSystemMenuTracingIcon,
      message_center::SystemNotificationWarningLevel::NORMAL);
  notification->set_pinned(true);
  MessageCenter::Get()->AddNotification(std::move(notification));
}

void TracingNotificationController::RemoveNotification() {
  message_center::MessageCenter::Get()->RemoveNotification(kNotificationId,
                                                           false /* by_user */);
}

}  // namespace ash
