// 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 <stdio.h>
#include <zircon/assert.h>

#include <ddk/device.h>
#include <ddk/driver.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_
