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

#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_SETTINGS_PLUGIN_H_
#define FLUTTER_SHELL_PLATFORM_WINDOWS_SETTINGS_PLUGIN_H_

#include <Windows.h>

#include <memory>

#include "flutter/shell/platform/common/client_wrapper/include/flutter/basic_message_channel.h"
#include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h"
#include "flutter/shell/platform/windows/event_watcher.h"
#include "flutter/shell/platform/windows/task_runner.h"
#include "rapidjson/document.h"

namespace flutter {

// Abstract settings plugin.
//
// Used to look up and notify Flutter of user-configured system settings.
// These are typically set in the control panel.
class SettingsPlugin {
 public:
  explicit SettingsPlugin(BinaryMessenger* messenger, TaskRunner* task_runner);

  virtual ~SettingsPlugin();

  // Sends settings (e.g., platform brightness) to the engine.
  void SendSettings();

  // Start watching settings changes and notify the engine of the update.
  virtual void StartWatching();

  // Stop watching settings change. The `SettingsPlugin` destructor will call
  // this automatically.
  virtual void StopWatching();

 protected:
  enum struct PlatformBrightness { kDark, kLight };

  // Returns `true` if the user uses 24 hour time.
  virtual bool GetAlwaysUse24HourFormat();

  // Returns the user-preferred text scale factor.
  virtual float GetTextScaleFactor();

  // Returns the user-preferred brightness.
  virtual PlatformBrightness GetPreferredBrightness();

 private:
  std::unique_ptr<BasicMessageChannel<rapidjson::Document>> channel_;

  void WatchPreferredBrightnessChanged();
  void WatchTextScaleFactorChanged();

  HKEY preferred_brightness_reg_hkey_ = nullptr;
  HKEY text_scale_factor_reg_hkey_ = nullptr;

  std::unique_ptr<EventWatcher> preferred_brightness_changed_watcher_;
  std::unique_ptr<EventWatcher> text_scale_factor_changed_watcher_;

  TaskRunner* task_runner_;

  SettingsPlugin(const SettingsPlugin&) = delete;
  SettingsPlugin& operator=(const SettingsPlugin&) = delete;
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_WINDOWS_SETTINGS_PLUGIN_H_
