// 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_FLUTTER_DESKTOP_MESSENGER_H_
#define FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_DESKTOP_MESSENGER_H_

#include <atomic>
#include <mutex>

#include "flutter/shell/platform/common/public/flutter_messenger.h"

namespace flutter {

class FlutterWindowsEngine;

/// A messenger object used to invoke platform messages.
///
/// On Windows, the message handler is essentially the |FlutterWindowsEngine|,
/// this allows a handle to the |FlutterWindowsEngine| that will become
/// invalidated if the |FlutterWindowsEngine| is destroyed.
class FlutterDesktopMessenger {
 public:
  FlutterDesktopMessenger() = default;

  /// Convert to FlutterDesktopMessengerRef.
  FlutterDesktopMessengerRef ToRef() {
    return reinterpret_cast<FlutterDesktopMessengerRef>(this);
  }

  /// Convert from FlutterDesktopMessengerRef.
  static FlutterDesktopMessenger* FromRef(FlutterDesktopMessengerRef ref) {
    return reinterpret_cast<FlutterDesktopMessenger*>(ref);
  }

  /// Getter for the engine field.
  flutter::FlutterWindowsEngine* GetEngine() const { return engine; }

  /// Setter for the engine field.
  /// Thread-safe.
  void SetEngine(flutter::FlutterWindowsEngine* arg_engine) {
    std::scoped_lock lock(mutex_);
    engine = arg_engine;
  }

  /// Increments the reference count.
  ///
  /// Thread-safe.
  FlutterDesktopMessenger* AddRef() {
    ref_count_.fetch_add(1);
    return this;
  }

  /// Decrements the reference count and deletes the object if the count has
  /// gone to zero.
  ///
  /// Thread-safe.
  void Release() {
    int32_t old_count = ref_count_.fetch_sub(1);
    if (old_count <= 1) {
      delete this;
    }
  }

  /// Returns the mutex associated with the |FlutterDesktopMessenger|.
  ///
  /// This mutex is used to synchronize reading or writing state inside the
  /// |FlutterDesktopMessenger| (ie |engine|).
  std::mutex& GetMutex() { return mutex_; }

  FlutterDesktopMessenger(const FlutterDesktopMessenger& value) = delete;
  FlutterDesktopMessenger& operator=(const FlutterDesktopMessenger& value) =
      delete;

 private:
  // The engine that owns this state object.
  flutter::FlutterWindowsEngine* engine = nullptr;
  std::mutex mutex_;
  std::atomic<int32_t> ref_count_ = 0;
};
}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_WINDOW_STATE_H_
