// 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();

  // Starts watching brightness changes.
  virtual void WatchPreferredBrightnessChanged();

  // Starts watching text scale factor changes.
  virtual void WatchTextScaleFactorChanged();

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

  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_
