/* 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_STATEMENT_H_
#define RUNTIME_PROBE_PROBE_STATEMENT_H_

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

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

#include "runtime_probe/probe_function.h"
#include "runtime_probe/probe_result_checker.h"

namespace runtime_probe {

class ProbeStatement {
  /* Holds a probe statement with following JSON schema::
   *   {
   *     "eval": <function_name:string> |
   *             <func:ProbeFunction> |
   *             [<func:ProbeFunction>],
   *     "keys": [<key:string>],
   *     "expect": <see |ProbeResultChecker|>,
   *     "information": <info:DictValue>,
   *   }
   *
   * For "eval", the case "[<func:ProbeFunction>]" will be transformed into::
   *   (ProbeFunction) {
   *     "function_name": "sequence",
   *     "args": {
   *       "functions": [<func:ProbeFunction>]
   *     }
   *   }
   *
   * For "expect", the dictionary value should represent a |ProbeResultChecker|
   * object.  See |ProbeResultChecker| for more details.
   *
   * When evaluating a |ProbeStatement|, the |ProbeFunction| defined by "eval"
   * will be called.  The results will be filtered / processed by "keys" and
   * "expect" rules.  See |ProbeStatement.Eval()| for more details.
   */
 public:
  static std::unique_ptr<ProbeStatement> FromValue(std::string component_name,
                                                   const base::Value& dv);

  /* Evaluate the probe statement.
   *
   * The process can be break into following steps:
   * - Call probe function |eval_|
   * - Filter results by |key_|  (if |key_| is not empty)
   * - Transform and check results by |expect_|  (if |expect_| is not empty)
   * - Return final results that passed |expect_| check.
   */
  ProbeFunction::DataType Eval() const;

  base::Optional<base::Value> GetInformation() const {
    if (information_)
      return information_->Clone();
    return base::nullopt;
  }

 private:
  ProbeStatement() = default;

  std::string component_name_;
  std::unique_ptr<ProbeFunction> eval_;
  std::set<std::string> key_;
  std::unique_ptr<ProbeResultChecker> expect_;
  base::Optional<base::Value> information_;

  FRIEND_TEST(ProbeConfigTest, LoadConfig);
  FRIEND_TEST(ProbeStatementTest, TestEval);
};

}  // namespace runtime_probe

#endif  // RUNTIME_PROBE_PROBE_STATEMENT_H_
