// 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/cobalt/bin/app/activity_listener_impl.h"

#include <iostream>

#include "fuchsia/ui/activity/cpp/fidl.h"
#include "lib/async/cpp/task.h"

namespace cobalt {

std::map<fuchsia::ui::activity::State, ActivityState> state_map = {
    {fuchsia::ui::activity::State::ACTIVE, ActivityState::ACTIVE},
    {fuchsia::ui::activity::State::IDLE, ActivityState::IDLE},
    {fuchsia::ui::activity::State::UNKNOWN, ActivityState::UNKNOWN},
};

ActivityListenerImpl::ActivityListenerImpl(async_dispatcher_t* dispatcher,
                                           std::shared_ptr<sys::ServiceDirectory> services)
    : dispatcher_(dispatcher),
      services_(std::move(services)),
      backoff_(/*initial_delay=*/zx::msec(100), /*retry_factor=*/2u, /*max_delay=*/zx::hour(1)) {}

void ActivityListenerImpl::OnStateChanged(fuchsia::ui::activity::State state,
                                          zx_time_t transition_time,
                                          OnStateChangedCallback callback) {
  SetState(state);
  callback();
}

void ActivityListenerImpl::Start(const std::function<void(cobalt::ActivityState)>& callback) {
  if (callback_) {
    FX_LOGS(ERROR) << "Callback value already set. Replacing the current value.";
  }
  callback_ = callback;
  StartListening();
  Update();
}

void ActivityListenerImpl::StartListening() {
  activity_state_ptr_ = services_->Connect<fuchsia::ui::activity::Provider>();
  activity_state_ptr_.set_error_handler([this](zx_status_t status) {
    FX_PLOGS(ERROR, status) << "Lost connection to fuchsia.ui.activity";
    RestartListening();
  });

  activity_state_ptr_->WatchState(binding_.NewBinding(dispatcher_));
}

void ActivityListenerImpl::RestartListening() {
  SetState(fuchsia::ui::activity::State::UNKNOWN);
  activity_state_ptr_.Unbind();

  reconnect_task_.Reset([this] { StartListening(); });
  async::PostDelayedTask(dispatcher_, reconnect_task_.callback(), backoff_.GetNext());
}

void ActivityListenerImpl::SetState(fuchsia::ui::activity::State state) {
  state_ = state_map[state];
  Update();
}

void ActivityListenerImpl::Update() {
  if (callback_) {
    callback_.value()(state_);
  }
}

}  // namespace cobalt
