/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <cstdint> // IWYU pragma: keep
#include <initializer_list>
#include <string>
#include <vector>

#include <cm/optional>
#include <cm/string_view>
#include <cmext/enum_set>
#include <cmext/string_view>

class cmMakefile;

class cmWindowsRegistry
{
public:
  enum class View
  {
    Both,
    Target,
    Host,
    Reg64_32,
    Reg32_64,
    Reg32,
    Reg64
  };

  // Registry supported types
  enum class ValueType : std::uint8_t
  {
    Reg_SZ,
    Reg_EXPAND_SZ,
    Reg_MULTI_SZ,
    Reg_DWORD,
    Reg_QWORD
  };
  using ValueTypeSet = cm::enum_set<ValueType>;

  // All types as defined by enum ValueType
  static const ValueTypeSet AllTypes;
  // same as AllTYpes but without type REG_MULTI_SZ
  static const ValueTypeSet SimpleTypes;

  cmWindowsRegistry(cmMakefile&,
                    const ValueTypeSet& supportedTypes = AllTypes);

  // Helper routine to convert string to enum value
  static cm::optional<View> ToView(cm::string_view name);
  // Helper routine to convert enum to string
  static cm::string_view FromView(View view);

  cm::optional<std::string> ReadValue(cm::string_view key,
                                      View view = View::Both,
                                      cm::string_view separator = "\0"_s)
  {
    return this->ReadValue(key, ""_s, view, separator);
  }
  cm::optional<std::string> ReadValue(cm::string_view key,
                                      cm::string_view name,
                                      View view = View::Both,
                                      cm::string_view separator = "\0"_s);

  cm::optional<std::vector<std::string>> GetValueNames(cm::string_view key,
                                                       View view = View::Both);
  cm::optional<std::vector<std::string>> GetSubKeys(cm::string_view key,
                                                    View view = View::Both);

  // Expand an expression which may contains multiple references
  // to registry keys.
  // Depending of the view specified, one or two expansions can be done.
  cm::optional<std::vector<std::string>> ExpandExpression(
    cm::string_view expression, View view, cm::string_view separator = "\0"_s);

  cm::string_view GetLastError() const;

private:
#if defined(_WIN32) && !defined(__CYGWIN__)
  std::vector<View> ComputeViews(View view);

  int TargetSize = 0;
  ValueTypeSet SupportedTypes = AllTypes;
#endif
  std::string LastError;
};
