// Copyright 2025 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.

#include <lib/driver/power/cpp/suspend.h>
#include <lib/fidl/cpp/channel.h>

namespace fdf_power {
namespace fps = fuchsia_power_system;

Completer::~Completer() {
  ZX_ASSERT_MSG(callback_ == std::nullopt, "Completer was not called before going out of scope.");
}

void Completer::operator()() {
  ZX_ASSERT_MSG(callback_ != std::nullopt, "Cannot call Completer more than once.");
  auto callback = std::move(callback_.value());
  callback_.reset();
  callback();
}

namespace internal {
zx::result<fidl::ServerEnd<fps::SuspendBlocker>> RegisterSuspendHooks(fdf::Namespace& incoming,
                                                                      std::string_view name) {
  zx::result sag = incoming.Connect<fps::ActivityGovernor>();
  if (sag.is_error()) {
    return sag.take_error();
  }

  auto [client_end, server_end] = fidl::Endpoints<fps::SuspendBlocker>::Create();
  auto result = fidl::Call(sag.value())
                    ->RegisterSuspendBlocker(fps::ActivityGovernorRegisterSuspendBlockerRequest{{
                        .suspend_blocker = std::move(client_end),
                        .name = std::string(name),
                    }});
  if (result.is_error()) {
    return zx::error(ZX_ERR_NOT_FOUND);
  }

  return zx::ok(std::move(server_end));
}
}  // namespace internal

}  // namespace fdf_power
