// Copyright (c) 2015 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.

#include "shell/browser/ui/electron_menu_model.h"

#include <utility>

namespace electron {

#if BUILDFLAG(IS_MAC)
ElectronMenuModel::SharingItem::SharingItem() = default;
ElectronMenuModel::SharingItem::SharingItem(SharingItem&&) = default;
ElectronMenuModel::SharingItem::~SharingItem() = default;
#endif

bool ElectronMenuModel::Delegate::GetAcceleratorForCommandId(
    int command_id,
    ui::Accelerator* accelerator) const {
  return GetAcceleratorForCommandIdWithParams(command_id, false, accelerator);
}

ElectronMenuModel::ElectronMenuModel(Delegate* delegate)
    : ui::SimpleMenuModel(delegate), delegate_(delegate) {}

ElectronMenuModel::~ElectronMenuModel() = default;

void ElectronMenuModel::SetToolTip(size_t index,
                                   const std::u16string& toolTip) {
  int command_id = GetCommandIdAt(index);
  toolTips_[command_id] = toolTip;
}

std::u16string ElectronMenuModel::GetToolTipAt(size_t index) {
  const int command_id = GetCommandIdAt(index);
  const auto iter = toolTips_.find(command_id);
  return iter == std::end(toolTips_) ? std::u16string() : iter->second;
}

void ElectronMenuModel::SetCustomType(size_t index,
                                      const std::u16string& customType) {
  int command_id = GetCommandIdAt(index);
  customTypes_[command_id] = customType;
}

std::u16string ElectronMenuModel::GetCustomTypeAt(size_t index) {
  const int command_id = GetCommandIdAt(index);
  const auto iter = customTypes_.find(command_id);
  return iter == std::end(customTypes_) ? std::u16string() : iter->second;
}

std::u16string ElectronMenuModel::GetAccessibilityLabelAt(size_t index) const {
  if (delegate_)
    return delegate_->GetAccessibilityLabelForCommandId(GetCommandIdAt(index));
  return std::u16string();
}

void ElectronMenuModel::SetRole(size_t index, const std::u16string& role) {
  int command_id = GetCommandIdAt(index);
  roles_[command_id] = role;
}

std::u16string ElectronMenuModel::GetRoleAt(size_t index) {
  const int command_id = GetCommandIdAt(index);
  const auto iter = roles_.find(command_id);
  return iter == std::end(roles_) ? std::u16string() : iter->second;
}

std::u16string ElectronMenuModel::GetLabelAt(size_t index) const {
  if (delegate_)
    return delegate_->GetLabelForCommandId(GetCommandIdAt(index));
  return std::u16string();
}

std::u16string ElectronMenuModel::GetSecondaryLabelAt(size_t index) const {
  if (delegate_)
    return delegate_->GetSecondaryLabelForCommandId(GetCommandIdAt(index));
  return std::u16string();
}

ui::ImageModel ElectronMenuModel::GetIconAt(size_t index) const {
  if (delegate_)
    return delegate_->GetIconForCommandId(GetCommandIdAt(index));
  return ui::ImageModel();
}

bool ElectronMenuModel::GetAcceleratorAtWithParams(
    size_t index,
    bool use_default_accelerator,
    ui::Accelerator* accelerator) const {
  if (delegate_) {
    return delegate_->GetAcceleratorForCommandIdWithParams(
        GetCommandIdAt(index), use_default_accelerator, accelerator);
  }
  return false;
}

bool ElectronMenuModel::ShouldRegisterAcceleratorAt(size_t index) const {
  if (delegate_) {
    return delegate_->ShouldRegisterAcceleratorForCommandId(
        GetCommandIdAt(index));
  }
  return true;
}

bool ElectronMenuModel::WorksWhenHiddenAt(size_t index) const {
  if (delegate_) {
    return delegate_->ShouldCommandIdWorkWhenHidden(GetCommandIdAt(index));
  }
  return true;
}

#if BUILDFLAG(IS_MAC)
bool ElectronMenuModel::GetSharingItemAt(size_t index,
                                         SharingItem* item) const {
  if (delegate_)
    return delegate_->GetSharingItemForCommandId(GetCommandIdAt(index), item);
  return false;
}

void ElectronMenuModel::SetSharingItem(SharingItem item) {
  sharing_item_.emplace(std::move(item));
}
#endif

void ElectronMenuModel::MenuWillClose() {
  ui::SimpleMenuModel::MenuWillClose();
  observers_.Notify(&Observer::OnMenuWillClose);
}

void ElectronMenuModel::MenuWillShow() {
  ui::SimpleMenuModel::MenuWillShow();
  observers_.Notify(&Observer::OnMenuWillShow);
}

ElectronMenuModel* ElectronMenuModel::GetSubmenuModelAt(size_t index) {
  return static_cast<ElectronMenuModel*>(
      ui::SimpleMenuModel::GetSubmenuModelAt(index));
}

}  // namespace electron
