// Copyright 2017 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/ledger/bin/testing/loop_controller_real_loop.h"

#include <lib/async-loop/cpp/loop.h>
#include <lib/async/cpp/task.h>
#include <lib/zx/time.h>

#include "src/ledger/bin/testing/blocking_callback_waiter.h"

namespace ledger {

namespace {

// Implementation of a SubLoop that uses a real loop.
class SubLoopRealLoop : public SubLoop {
 public:
  SubLoopRealLoop() : loop_(&kAsyncLoopConfigNoAttachToThread) {
    loop_.StartThread();
  };

  ~SubLoopRealLoop() override { loop_.Shutdown(); }

  void DrainAndQuit() override {
    async::TaskClosure quit_task([this] { loop_.Quit(); });
    quit_task.Post(loop_.dispatcher());
    loop_.JoinThreads();
  }

  async_dispatcher_t* dispatcher() override { return loop_.dispatcher(); }

 private:
  async::Loop loop_;
};

}  // namespace

LoopControllerRealLoop::LoopControllerRealLoop()
    : loop_(&kAsyncLoopConfigAttachToThread) {}

LoopControllerRealLoop::~LoopControllerRealLoop() {}

void LoopControllerRealLoop::RunLoop() {
  loop_.Run();
  loop_.ResetQuit();
}

void LoopControllerRealLoop::StopLoop() { loop_.Quit(); }

std::unique_ptr<SubLoop> LoopControllerRealLoop::StartNewLoop() {
  return std::make_unique<SubLoopRealLoop>();
}

std::unique_ptr<CallbackWaiter> LoopControllerRealLoop::NewWaiter() {
  return std::make_unique<BlockingCallbackWaiter>(this);
}

async_dispatcher_t* LoopControllerRealLoop::dispatcher() {
  return loop_.dispatcher();
}

bool LoopControllerRealLoop::RunLoopUntil(fit::function<bool()> condition) {
  while (true) {
    if (condition()) {
      return true;
    }
    RunLoopFor(zx::msec(10));
  }
}

void LoopControllerRealLoop::RunLoopFor(zx::duration duration) {
  async::TaskClosure task([this] { loop_.Quit(); });
  task.PostDelayed(loop_.dispatcher(), duration);
  loop_.Run();
  loop_.ResetQuit();
}

}  // namespace ledger
