// 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.

#ifndef RUNTIME_PROBE_PROBE_CONFIG_H_
#define RUNTIME_PROBE_PROBE_CONFIG_H_

#include <map>
#include <memory>
#include <string>
#include <vector>

#include <base/values.h>
#include <gtest/gtest.h>

#include "runtime_probe/component_category.h"

namespace runtime_probe {

class ProbeConfig {
  // Holds a probe config.
  //
  // The input will be in JSON format with following schema::
  //   {
  //     <category:string>: {
  //       <component_name:string>: <statement:ProbeStatement>,
  //       ...
  //     }
  //   }

 public:
  static std::unique_ptr<ProbeConfig> FromValue(const base::Value& dv);

  // Evaluates the probe config.
  //
  // @param category: specifies the components to probe.
  // @return base::Value with the following format:
  //   {
  //     <category:string>: [
  //       {
  //         "name": <component_name:string>,
  //         "values": <probed_values of ProbeStatement>,
  //         "information": <information of ProbeStatement>
  //       }
  //     ]
  //   }
  base::Value Eval(const std::vector<std::string>& category) const;

  // Evaluates the probe config.
  //
  // This is the same as calling `this->eval({keys of category_})`.
  base::Value Eval() const;

  ComponentCategory* GetComponentCategory(
      const std::string& category_name) const;

 private:
  // Must call `FromValue()` to create an instance.
  ProbeConfig() = default;

  std::map<std::string, std::unique_ptr<ComponentCategory>> category_;

  FRIEND_TEST(ProbeConfigTest, LoadConfig);
};

}  // namespace runtime_probe

#endif  // RUNTIME_PROBE_PROBE_CONFIG_H_
