// Copyright 2017 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 COBALT_CONFIG_ANALYZER_CONFIG_MANAGER_H_
#define COBALT_CONFIG_ANALYZER_CONFIG_MANAGER_H_

#include <memory>
#include <mutex>
#include <string>

#include "config/analyzer_config.h"

namespace cobalt {
namespace config {

// AnalyzerConfigManager vends shared pointers to an AnalyzerConfig.
// The purpose of this class is to be able to update the configuration data
// pointers to which it vends.
class AnalyzerConfigManager {
 public:
  // Get a pointer to the current analyzer config. Do not cache.
  std::shared_ptr<AnalyzerConfig> GetCurrent();

  // Updates the cached configuration from the external Git repository specified
  // in the constructor. This may block for up to |timeout_seconds| seconds.
  // Returns true if the update operation succeeded. Otherwise the previous
  // cached configuration is maintained.
  bool Update(unsigned int timeout_seconds);

  static std::shared_ptr<AnalyzerConfigManager> CreateFromFlagsOrDie();

  // This constructor is to be used when parameters related to updating the
  // configuration are unnecessary because you don't intend to update the
  // config. (such as in tests.)
  explicit AnalyzerConfigManager(std::shared_ptr<AnalyzerConfig> config);

 private:
  // Constructor.
  // |config| is the initial configuration to be held.
  // |cobalt_config_proto_path| is the path on disk where the serialized
  // CobaltConfig is to be stored.
  // |config_update_repository_url| is the url for a git repository containing
  // cobalt configuration information. It is parsed using config_parser. See
  // the documentation for config_parser to understand the format of the repo.
  // |config_parser_bin_path| is the path to the config_parser binary.
  AnalyzerConfigManager(std::shared_ptr<AnalyzerConfig> config,
                        std::string cobalt_config_proto_path,
                        std::string config_update_repository_url,
                        std::string config_parser_bin_path);

  // Reads the configuration from a file containing a serialized CobaltConfig.
  static std::unique_ptr<AnalyzerConfig>
  ReadConfigFromSerializedCobaltConfigFile(std::string config_path);

  std::shared_ptr<AnalyzerConfig> ptr_;
  // This mutex protects ptr_. A thread dereferencing or updating ptr_ should
  // grab a lock on m_ first.
  std::mutex m_;
  const std::string cobalt_config_proto_path_;
  const std::string update_repository_path_;
  const std::string config_parser_bin_path_;
};

}  // namespace config
}  // namespace cobalt

#endif  // COBALT_CONFIG_ANALYZER_CONFIG_MANAGER_H_
