/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst 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 ValueTypeSet const AllTypes;
  // same as AllTypes but without type REG_MULTI_SZ
  static ValueTypeSet const SimpleTypes;

  cmWindowsRegistry(cmMakefile&,
                    ValueTypeSet const& 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;
};
