// Copyright 2019 The Fuchsia 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 SRC_COBALT_BIN_APP_CONFIGURATION_DATA_H_
#define SRC_COBALT_BIN_APP_CONFIGURATION_DATA_H_

#include <iostream>
#include <string>

#include "src/lib/json_parser/json_parser.h"
#include "third_party/cobalt/src/lib/statusor/statusor.h"
#include "third_party/cobalt/src/public/cobalt_service_interface.h"
#include "third_party/cobalt/src/registry/metric_definition.pb.h"
#include "third_party/cobalt/src/system_data/configuration_data.h"

namespace cobalt {

// A class for handling parsing and reading values from config.json
class JSONHelper {
 public:
  JSONHelper(const std::string& path);

  lib::statusor::StatusOr<std::string> GetString(const std::string& key) const;
  lib::statusor::StatusOr<bool> GetBool(const std::string& key) const;

 private:
  util::Status EnsureKey(const std::string& key) const;

  json::JSONParser json_parser_;
  rapidjson::Document config_file_contents_;
};

// Encapsulation of the configuration data used by Cobalt in Fuchsia.
class FuchsiaConfigurationData {
 public:
  explicit FuchsiaConfigurationData(const std::string& config_dir = kDefaultConfigDir,
                                    const std::string& environment_dir = kDefaultEnvironmentDir);

  // Get the backend environment to write to.
  config::Environment GetBackendEnvironment() const;

  // Get the path to the public key file to use for encrypting Observations.
  const char* AnalyzerPublicKeyPath() const;

  // Get the path to the public key file to use for encrypting Envelopes.
  const char* ShufflerPublicKeyPath() const;

  // Get the Clearcut Log Source ID that Cobalt should write its logs to.
  int32_t GetLogSourceId() const;

  cobalt::ReleaseStage GetReleaseStage() const;

  cobalt::CobaltServiceInterface::DataCollectionPolicy GetDataCollectionPolicy() const;

  bool GetWatchForUserConsent() const;

  bool GetEnableReplacementMetrics() const;

  // Returns the cobalt API key. If it cannot be found, return the default API key.
  std::string GetApiKey() const;

 private:
  static const char kDefaultConfigDir[];
  static const char kDefaultEnvironmentDir[];
  config::Environment backend_environment_;
  config::ConfigurationData backend_configuration_;
  std::string api_key_;

  JSONHelper json_helper_;
  cobalt::ReleaseStage release_stage_;
  cobalt::CobaltServiceInterface::DataCollectionPolicy data_collection_policy_;
  bool watch_for_user_consent_;
  bool enable_replacement_metrics_;
};

}  // namespace cobalt

#endif  // SRC_COBALT_BIN_APP_CONFIGURATION_DATA_H_
