// 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 ARC_SETUP_CONFIG_H_
#define ARC_SETUP_CONFIG_H_

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

#include <base/environment.h>
#include <base/macros.h>
#include <base/strings/string_piece.h>
#include <base/values.h>

namespace base {

class FilePath;

}  // namespace base

namespace arc {

// A class that holds configuration variables for arc-setup.
class Config {
 public:
  Config(const base::FilePath& config_json,
         std::unique_ptr<base::Environment> config_env);
  Config(const Config&) = delete;
  Config& operator=(const Config&) = delete;

  ~Config();

  // Finds a string config with |name| first in JSON and stores it in |out| if
  // found. If the |name| is not in JSON, does the same search against the
  // environment variables. Returns true if found.
  bool GetString(base::StringPiece name, std::string* out) const;

  // Finds an integer config with |name| in JSON and stores it in |out| if
  // found. If the |name| is not in JSON, does the same search against the
  // environment variables. Returns true if an integer entry in JSON or
  // an integer-compatible string in env (e.g. "123", "-123") is found.
  bool GetInt(base::StringPiece name, int* out) const;

  // Finds a boolean config with |name| in JSON and stores it in |out| if
  // found. If the |name| is not in JSON, does the same search against the
  // environment variables. Returns true if a boolean entry in JSON or
  // a boolean-compatible string in env (e.g. "1", "0", "false") is found.
  bool GetBool(base::StringPiece name, bool* out) const;

  // These functions do the same as above, but aborts when |name| is not found.
  std::string GetStringOrDie(base::StringPiece name) const;
  int GetIntOrDie(base::StringPiece name) const;
  bool GetBoolOrDie(base::StringPiece name) const;

 private:
  bool ParseJsonFile(const base::FilePath& config_json);
  base::Value* FindConfig(base::StringPiece name) const;

  std::map<std::string, std::unique_ptr<base::Value>> json_;
  std::unique_ptr<base::Environment> env_;
};

}  // namespace arc

#endif  // ARC_SETUP_CONFIG_H_
