// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <windows.h>

namespace url_launcher_windows {

// An interface wrapping system APIs used by the plugin, for mocking.
class SystemApis {
 public:
  SystemApis();
  virtual ~SystemApis();

  // Disallow copy and move.
  SystemApis(const SystemApis&) = delete;
  SystemApis& operator=(const SystemApis&) = delete;

  // Wrapper for RegCloseKey.
  virtual LSTATUS RegCloseKey(HKEY key) = 0;

  // Wrapper for RegQueryValueEx.
  virtual LSTATUS RegQueryValueExW(HKEY key, LPCWSTR value_name, LPDWORD type,
                                   LPBYTE data, LPDWORD data_size) = 0;

  // Wrapper for RegOpenKeyEx.
  virtual LSTATUS RegOpenKeyExW(HKEY key, LPCWSTR sub_key, DWORD options,
                                REGSAM desired, PHKEY result) = 0;

  // Wrapper for ShellExecute.
  virtual HINSTANCE ShellExecuteW(HWND hwnd, LPCWSTR operation, LPCWSTR file,
                                  LPCWSTR parameters, LPCWSTR directory,
                                  int show_flags) = 0;
};

// Implementation of SystemApis using the Win32 APIs.
class SystemApisImpl : public SystemApis {
 public:
  SystemApisImpl();
  virtual ~SystemApisImpl();

  // Disallow copy and move.
  SystemApisImpl(const SystemApisImpl&) = delete;
  SystemApisImpl& operator=(const SystemApisImpl&) = delete;

  // SystemApis Implementation:
  virtual LSTATUS RegCloseKey(HKEY key);
  virtual LSTATUS RegOpenKeyExW(HKEY key, LPCWSTR sub_key, DWORD options,
                                REGSAM desired, PHKEY result);
  virtual LSTATUS RegQueryValueExW(HKEY key, LPCWSTR value_name, LPDWORD type,
                                   LPBYTE data, LPDWORD data_size);
  virtual HINSTANCE ShellExecuteW(HWND hwnd, LPCWSTR operation, LPCWSTR file,
                                  LPCWSTR parameters, LPCWSTR directory,
                                  int show_flags);
};

}  // namespace url_launcher_windows
