// Copyright 2018 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_DEVELOPER_DEBUG_ZXDB_CLIENT_SETTING_SCHEMA_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_SETTING_SCHEMA_H_

#include <map>

#include "src/developer/debug/zxdb/client/setting_value.h"
#include "src/developer/debug/zxdb/common/err.h"
#include "src/lib/fxl/memory/ref_counted.h"

namespace zxdb {

// Stores the setting information for a particular context. These are meant to be used for
// validation of settings for particular objects (thread, process, etc.).
class SettingSchema : public fxl::RefCountedThreadSafe<SettingSchema> {
 public:
  // The SchemaSetting holds the actual setting (the value that is stored and overridden by
  // SettingStore) + some metadata useful for implementing more complex settings such as enums, by
  // using the |options| field.
  struct Record {
    std::string name;
    std::string description;

    SettingValue default_value;
    std::vector<std::string> options;  // Used only for string lists.
  };

  bool HasSetting(const std::string& key);

  bool empty() const { return settings_.empty(); }

  // Returns a null record pointer if the schema does not support a setting with that name.
  const Record* GetSetting(const std::string& name) const;
  const std::map<std::string, Record>& settings() const { return settings_; }

  // Create new items for simple settings that only belong to this schema. For inter-schema options
  // or for the more complex schema types, create the Setting separately and then insert it to each
  // schema with AddSetting().
  //
  // For the String variant, it can take a list of valid options which new values must match to
  // validate against. This is done as a case-sensitive comparison.
  void AddBool(std::string name, std::string description, bool value = false);
  void AddInt(std::string name, std::string description, int64_t value = 0);
  void AddExecutionScope(std::string name, std::string description,
                         const ExecutionScope value = ExecutionScope());
  void AddInputLocations(std::string name, std::string description,
                         std::vector<InputLocation> = {});
  void AddString(std::string name, std::string description, std::string value = {},
                 std::vector<std::string> valid_options = {});

  // |valid_options| determines which list values will be accepted when writing into a setting which
  // allows implementation of a list of enumerations.
  //
  // Will return false if the given list has a entry that is not within the valid options.
  bool AddList(std::string name, std::string description, std::vector<std::string> list = {},
               std::vector<std::string> valid_options = {});

  // |valid_options| determines which list values will be accepted when writing into a string or
  // list setting  which allows implementation of a list of enumerations.
  //
  // In the future if we need enums that aren't strings, the valid_options vector should be changed
  // to a vector<SettingValue>.
  void AddSetting(std::string name, std::string description, SettingValue default_value,
                  std::vector<std::string> valid_options = {});

  Err ValidateSetting(const std::string& key, const SettingValue&) const;

 private:
  std::map<std::string, Record> settings_;
};

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_SETTING_SCHEMA_H_
