// Copyright 2019 The Fuchsia 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 SRC_LIB_DDKTL_INCLUDE_DDKTL_SUSPEND_TXN_H_
#define SRC_LIB_DDKTL_INCLUDE_DDKTL_SUSPEND_TXN_H_

#include <lib/ddk/device.h>
#include <lib/ddk/driver.h>
#include <stdio.h>
#include <zircon/assert.h>

namespace ddk {

class SuspendTxn {
 public:
  explicit SuspendTxn(zx_device_t* dev, uint8_t requested_state, bool enable_wake,
                      uint8_t suspend_reason)
      : dev_(dev),
        requested_state_(requested_state),
        suspend_reason_(suspend_reason),
        enable_wake_(enable_wake) {}

  ~SuspendTxn() {
    if (dev_) {
      ZX_ASSERT_MSG(replied_, "SuspendTxn must have it's Reply() method used.\n");
    }
  }

  SuspendTxn(SuspendTxn&& other) { MoveHelper(other); }
  SuspendTxn& operator=(SuspendTxn&& other) {
    MoveHelper(other);
    return *this;
  }

  // This is used to signify the completion of the device's suspend() hook.
  // It does not necessarily need to be called from within the suspend() hook.
  void Reply(zx_status_t status, uint8_t out_state) {
    ZX_ASSERT_MSG(dev_, "SuspendTxn did not contain any device pointer.\n");
    ZX_ASSERT_MSG(!replied_, "Cannot reply to SuspendTxn twice.");
    replied_ = true;
    device_suspend_reply(dev_, status, out_state);
  }

  uint8_t requested_state() { return requested_state_; }
  uint8_t suspend_reason() { return suspend_reason_; }
  bool enable_wake() { return enable_wake_; }

 private:
  zx_device_t* dev_ = nullptr;
  bool replied_ = false;
  uint8_t requested_state_;
  uint8_t suspend_reason_;
  bool enable_wake_;
  // Move-only type
  void MoveHelper(SuspendTxn& other) {
    dev_ = other.dev_;
    replied_ = other.replied_;
    requested_state_ = other.requested_state_;
    suspend_reason_ = other.suspend_reason_;
    enable_wake_ = other.enable_wake_;
    other.dev_ = nullptr;
    other.replied_ = false;
    other.requested_state_ = 0;
    other.suspend_reason_ = 0;
    other.enable_wake_ = false;
  }
};

}  // namespace ddk

#endif  // SRC_LIB_DDKTL_INCLUDE_DDKTL_SUSPEND_TXN_H_
