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

#ifndef SRC_COBALT_BIN_TESTING_FAKE_HTTP_LOADER_H_
#define SRC_COBALT_BIN_TESTING_FAKE_HTTP_LOADER_H_

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

#include "src/lib/callback/scoped_task_runner.h"

namespace cobalt {

class FakeHTTPLoader : public fuchsia::net::http::Loader {
 public:
  FakeHTTPLoader(async_dispatcher_t *dispatcher)
      : dispatcher_(dispatcher), task_runner_(dispatcher_) {}

  fidl::InterfaceRequestHandler<fuchsia::net::http::Loader> GetHandler() {
    return bindings_.GetHandler(this);
  }

  void SetResponse(fuchsia::net::http::Response response) {
    has_response_ = true;
    next_response_ = std::move(response);
  }

  void SetResponseDelay(zx::duration response_delay) { response_delay_ = response_delay; }

  void Fetch(fuchsia::net::http::Request request,
             fuchsia::net::http::Loader::FetchCallback callback) override {
    if (has_response_) {
      has_response_ = false;
      if (response_delay_ > zx::sec(0)) {
        if (zx::clock::get_monotonic() + response_delay_ > zx::time(request.deadline())) {
          fuchsia::net::http::Response response;
          response.set_error(fuchsia::net::http::Error::DEADLINE_EXCEEDED);
          callback(std::move(response));
        } else {
          callback(std::move(next_response_));
        }
      } else {
        callback(std::move(next_response_));
      }
    } else if (request.has_deadline()) {
      fuchsia::net::http::Response response;
      response.set_error(fuchsia::net::http::Error::DEADLINE_EXCEEDED);
      callback(std::move(response));
    }
  }

  void Start(fuchsia::net::http::Request request,
             fidl::InterfaceHandle<class fuchsia::net::http::LoaderClient> client) override {}

  void Unbind() { bindings_.CloseAll(); }

 private:
  bool has_response_ = false;
  zx::duration response_delay_ = zx::sec(0);
  async_dispatcher_t *dispatcher_;
  callback::ScopedTaskRunner task_runner_;
  fuchsia::net::http::Response next_response_;
  fidl::BindingSet<fuchsia::net::http::Loader> bindings_;
};

}  // namespace cobalt

#endif  // SRC_COBALT_BIN_TESTING_FAKE_HTTP_LOADER_H_
