/* 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 <base/values.h>
#include <brillo/map_utils.h>

#include "runtime_probe/component_category.h"
#include "runtime_probe/probe_config.h"

namespace runtime_probe {

std::unique_ptr<ProbeConfig> ProbeConfig::FromDictionaryValue(
    const base::DictionaryValue& dict_value) {
  std::unique_ptr<ProbeConfig> instance{new ProbeConfig};

  for (base::DictionaryValue::Iterator it{dict_value}; !it.IsAtEnd();
       it.Advance()) {
    const auto category = it.key();
    const base::DictionaryValue* components;

    if (!it.value().GetAsDictionary(&components)) {
      LOG(ERROR) << "Category " << category
                 << " is not a DictionaryValue: " << it.value();
      instance = nullptr;
      break;
    }

    instance->category_[category] =
        ComponentCategory::FromDictionaryValue(category, *components);

    if (!instance->category_[category]) {
      instance = nullptr;
      break;
    }
  }

  if (!instance)
    LOG(ERROR) << "Failed to parse " << dict_value << " as ProbeConfig";
  return instance;
}

std::unique_ptr<base::DictionaryValue> ProbeConfig::Eval() const {
  return Eval(brillo::GetMapKeysAsVector(category_));
}

std::unique_ptr<base::DictionaryValue> ProbeConfig::Eval(
    const std::vector<std::string>& category) const {
  std::unique_ptr<base::DictionaryValue> result{new base::DictionaryValue};

  for (const auto c : category) {
    auto it = category_.find(c);
    if (it == category_.end()) {
      LOG(ERROR) << "Category " << c << " is not defined";
      continue;
    }

    result->Set(c, it->second->Eval());
  }

  return result;
}

}  // namespace runtime_probe
