#pragma once
#include <Windows.h>

namespace brightray {

struct NotificationData {
  DesktopNotificationController* controller = nullptr;

  std::wstring caption;
  std::wstring body_text;
  HBITMAP image = NULL;

  NotificationData() = default;

  ~NotificationData() {
    if (image)
      DeleteObject(image);
  }

  NotificationData(const NotificationData& other) = delete;
  NotificationData& operator=(const NotificationData& other) = delete;
};

template <typename T>
constexpr T ScaleForDpi(T value, unsigned dpi, unsigned source_dpi = 96) {
  return value * dpi / source_dpi;
}

struct ScreenMetrics {
  UINT dpi_x, dpi_y;

  ScreenMetrics() {
    typedef HRESULT WINAPI GetDpiForMonitor_t(HMONITOR, int, UINT*, UINT*);

    auto GetDpiForMonitor = reinterpret_cast<GetDpiForMonitor_t*>(
        GetProcAddress(GetModuleHandle(TEXT("shcore")), "GetDpiForMonitor"));

    if (GetDpiForMonitor) {
      auto* monitor = MonitorFromPoint({}, MONITOR_DEFAULTTOPRIMARY);
      if (GetDpiForMonitor(monitor, 0, &dpi_x, &dpi_y) == S_OK)
        return;
    }

    HDC hdc = GetDC(NULL);
    dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
    dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
    ReleaseDC(NULL, hdc);
  }

  template <class T>
  T X(T value) const {
    return ScaleForDpi(value, dpi_x);
  }
  template <class T>
  T Y(T value) const {
    return ScaleForDpi(value, dpi_y);
  }
};

}  // namespace brightray
