// 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, int 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_
