// Copyright 2020 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 "src/sys/appmgr/lifecycle.h"

#include <lib/fidl-async/cpp/bind.h>

#include "src/sys/appmgr/appmgr.h"

namespace component {

zx_status_t LifecycleServer::Create(async_dispatcher_t* dispatcher, zx::channel channel) {
  auto result = fidl::BindServer(dispatcher, std::move(channel), this);
  if (result.is_error()) {
    zx_status_t status = result.take_error();
    FX_PLOGS(ERROR, status) << "Failed to connect to Lifecycle Service.";
    return status;
  }

  lifecycle_ = result.take_value();
  return ZX_OK;
}

void LifecycleServer::Close(zx_status_t status) {
  FX_LOGS(INFO) << "Closing appmgr lifecycle channel.";
  if (lifecycle_) {
    lifecycle_->Close(status);
  } else {
    FX_LOGS(ERROR) << "Appmgr lifecycle not bound.";
  }
}

void LifecycleServer::Stop(StopCompleter::Sync& completer) {
  FX_LOGS(INFO) << "appmgr: received shutdown command over lifecycle interface";
  child_lifecycles_ = appmgr_->Shutdown([this](zx_status_t status) mutable {
    FX_LOGS(INFO) << "Lifecycle Server complete callback";
    child_lifecycles_.clear();
    Close(status);
    stop_callback_(status);
  });
}

}  // namespace component
