// Copyright 2013 The Flutter Authors. All rights reserved.
// 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_plugin {

// 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_plugin
