// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/global_media_controls/supplemental_device_picker_item.h"

#include "base/unguessable_token.h"
#include "components/global_media_controls/public/constants.h"
#include "components/global_media_controls/public/media_item_manager.h"
#include "components/media_message_center/media_notification_util.h"
#include "components/media_message_center/media_notification_view.h"
#include "services/media_session/public/cpp/media_image_manager.h"
#include "services/media_session/public/cpp/media_metadata.h"
#include "ui/gfx/image/image_skia.h"

namespace global_media_controls {

SupplementalDevicePickerItem::SupplementalDevicePickerItem(
    global_media_controls::MediaItemManager* item_manager,
    const base::UnguessableToken& source_id)
    : id_(base::UnguessableToken::Create().ToString()),
      item_manager_(item_manager),
      source_id_(source_id) {}

SupplementalDevicePickerItem::~SupplementalDevicePickerItem() {
  item_manager_->HideItem(id_);
}

void SupplementalDevicePickerItem::SetView(
    media_message_center::MediaNotificationView* view) {
  view_ = view;
  if (!view_) {
    return;
  }
  UpdateViewWithImages();
  UpdateViewWithMetadata();
}

void SupplementalDevicePickerItem::Dismiss() {
  item_manager_->HideItem(id_);
}

void SupplementalDevicePickerItem::UpdateViewWithMetadata(
    const media_session::MediaMetadata& metadata) {
  metadata_ = metadata;
  UpdateViewWithMetadata();
}

void SupplementalDevicePickerItem::UpdateViewWithArtworkImage(
    std::optional<gfx::ImageSkia> artwork_image) {
  artwork_image_ = artwork_image;
  UpdateViewWithImages();
}

void SupplementalDevicePickerItem::UpdateViewWithFaviconImage(
    std::optional<gfx::ImageSkia> favicon_image) {
  favicon_image_ = favicon_image;
  UpdateViewWithImages();
}

bool SupplementalDevicePickerItem::RequestMediaRemoting() {
  return false;
}

media_message_center::Source SupplementalDevicePickerItem::GetSource() const {
  return media_message_center::Source::kCastDevicePicker;
}

media_message_center::SourceType SupplementalDevicePickerItem::GetSourceType()
    const {
  return media_message_center::SourceType::kPresentationRequest;
}

std::optional<base::UnguessableToken>
SupplementalDevicePickerItem::GetSourceId() const {
  return source_id_;
}

void SupplementalDevicePickerItem::UpdateViewWithMetadata() {
  if (!view_) {
    return;
  }
  view_->UpdateWithMediaMetadata(metadata_);
}

void SupplementalDevicePickerItem::UpdateViewWithImages() {
  if (!view_) {
    return;
  }
  if (favicon_image_) {
    view_->UpdateWithFavicon(*favicon_image_);
    return;
  }
  if (artwork_image_) {
    view_->UpdateWithMediaArtwork(*artwork_image_);
    return;
  }
  view_->UpdateWithFavicon(gfx::ImageSkia());
}

}  // namespace global_media_controls
