// Copyright 2018 The Chromium OS 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 <memory>
#include <utility>

#include <base/logging.h>
#include <base/values.h>
#include <brillo/map_utils.h>

#include "runtime_probe/component_category.h"

namespace runtime_probe {

std::unique_ptr<ComponentCategory> ComponentCategory::FromValue(
    const std::string& category_name, const base::Value& dv) {
  if (!dv.is_dict()) {
    LOG(ERROR) << "ComponentCategory::FromValue takes a dictionary as"
               << " parameter";
    return nullptr;
  }

  std::unique_ptr<ComponentCategory> instance{new ComponentCategory()};
  instance->category_name_ = category_name;

  for (const auto& entry : dv.DictItems()) {
    const auto& component_name = entry.first;
    const auto& value = entry.second;
    auto probe_statement = ProbeStatement::FromValue(component_name, value);
    if (!probe_statement) {
      LOG(ERROR) << "Component " << component_name
                 << " doesn't contain a valid probe statement.";
      return nullptr;
    }
    instance->component_[component_name] = std::move(probe_statement);
  }

  return instance;
}

base::Value ComponentCategory::Eval() const {
  base::Value::ListStorage results;

  for (const auto& entry : component_) {
    const auto& component_name = entry.first;
    const auto& probe_statement = entry.second;
    for (auto& probe_statement_dv : probe_statement->Eval()) {
      base::Value result(base::Value::Type::DICTIONARY);
      result.SetStringKey("name", component_name);
      result.SetKey("values", std::move(probe_statement_dv));
      auto information_dv = probe_statement->GetInformation();
      if (information_dv)
        result.SetKey("information", std::move(*information_dv));
      results.push_back(std::move(result));
    }
  }

  return base::Value(std::move(results));
}

std::vector<std::string> ComponentCategory::GetComponentNames() const {
  return brillo::GetMapKeysAsVector(component_);
}

}  // namespace runtime_probe
