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

#include "extensions/common/icons/extension_icon_variants.h"

#include "base/values.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/icons/extension_icon_variants_diagnostics.h"

static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));

namespace extensions {

namespace {
using Diagnostic = diagnostics::icon_variants::Diagnostic;
}  // namespace

ExtensionIconVariants::ExtensionIconVariants() = default;

ExtensionIconVariants::~ExtensionIconVariants() = default;

ExtensionIconVariants::ExtensionIconVariants(ExtensionIconVariants&& other) =
    default;

ExtensionIconVariants::ExtensionIconVariants(
    const ExtensionIconVariants& other) = default;

void ExtensionIconVariants::Parse(const Extension& extension,
                                  const base::ListValue* list) {
  // Parse each icon variant in `icon_variants`.
  for (auto& entry : *list) {
    std::string issue;
    std::unique_ptr<ExtensionIconVariant> icon_variant =
        ExtensionIconVariant::Parse(extension, entry);
    if (!icon_variant) {
      diagnostics_.emplace_back(diagnostics::icon_variants::GetDiagnostic(
          diagnostics::icon_variants::Feature::kIconVariants,
          diagnostics::icon_variants::Id::kEmptyIconVariant));
      continue;
    }

    // Move diagnostics for an icon_variant directly into icon_variants.
    auto& diagnostics = icon_variant->get_diagnostics();
    diagnostics_.insert(diagnostics_.end(), diagnostics.begin(),
                        diagnostics.end());
    diagnostics.clear();

    list_.emplace_back(std::move(*icon_variant));
  }

  // Add a warning for an empty list, but don't generate an error.
  if (list_.empty()) {
    diagnostics_.emplace_back(diagnostics::icon_variants::GetDiagnostic(
        diagnostics::icon_variants::Feature::kIconVariants,
        diagnostics::icon_variants::Id::kIconVariantsEmpty));
  }
}

bool ExtensionIconVariants::IsEmpty() const {
  return list_.empty();
}

void ExtensionIconVariants::Add(
    std::unique_ptr<ExtensionIconVariant> icon_variant) {
  list_.emplace_back(std::move(*icon_variant));
}

void ExtensionIconVariants::AddDiagnostic(
    diagnostics::icon_variants::Feature feature,
    diagnostics::icon_variants::Id id) {
  diagnostics_.emplace_back(
      diagnostics::icon_variants::GetDiagnostic(feature, id));
}

}  //  namespace extensions
