// Copyright 2018 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 GARNET_BIN_DISPLAY_CAPTURE_TEST_RUNNER_H_
#define GARNET_BIN_DISPLAY_CAPTURE_TEST_RUNNER_H_

#include <fuchsia/display/cpp/fidl.h>
#include <garnet/drivers/usb_video/usb-video-camera.h>
#include <inttypes.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fidl/cpp/synchronous_interface_ptr.h>
#include <lib/fsl/io/device_watcher.h>
#include <lib/fxl/files/unique_fd.h>
#include <zircon/pixelformat.h>
#include <zircon/types.h>
#include <deque>

#include "context.h"
#include "image.h"
#include "layer.h"

namespace display_test {

static constexpr uint32_t kMaxFrames = 32;

namespace internal {

class Runner {
 public:
  Runner(async::Loop* loop);
  zx_status_t Start(const char* display_name_);
  void Stop();

  Context* StartTest();
  int32_t CleanupTest();
  static constexpr int32_t kTestOk = 0;
  static constexpr int32_t kTestStatusUnknown = -1;
  static constexpr int32_t kTestDisplayCheckFail = -2;
  static constexpr int32_t kTestVsyncFail = -3;
  static constexpr int32_t kTestCaptureFail = -4;
  static constexpr int32_t kTestCaptureMismatch = -5;

  void ApplyConfig(std::vector<LayerImpl*> layers);

  uint32_t width() const { return width_; }
  uint32_t height() const { return height_; }
  zx_pixel_format_t format() const;

  fuchsia::display::ControllerPtr& display() { return display_controller_; }
  void OnResourceReady();

 private:
  void OnCameraAvailable(int dir_fd, std::string filename);

  void OnShutdownCallback();
  void GetFormatCallback(::fidl::VectorPtr<fuchsia::camera::VideoFormat> fmts,
                         uint32_t total_count, zx_status_t status);
  void FrameNotifyCallback(const fuchsia::camera::FrameAvailableEvent& resp);

  void InitDisplay();
  void OnDisplaysChanged(::fidl::VectorPtr<fuchsia::display::Info> added,
                         ::fidl::VectorPtr<uint64_t> removed);
  void OnClientOwnershipChange(bool is_owner);
  void OnVsync(uint64_t display_id, uint64_t timestamp,
               ::fidl::VectorPtr<uint64_t> image_ids);

  void SendFrameConfig(uint32_t frame_idx);
  void CheckFrameConfig(uint32_t frame_idx);
  void ApplyFrame(uint32_t frame_idx);
  bool CheckFrame(uint32_t frame_idx, uint8_t* capture_ptr, bool quick);

  void FinishTest(int32_t status);

  async::Loop* loop_;
  Context runner_context_;
  Image* calibration_image_a_;
  Image* calibration_image_b_;
  PrimaryLayer* calibration_layer_;

  const char* display_name_;
  fxl::UniqueFD dc_fd_;
  fuchsia::display::ControllerPtr display_controller_;
  uint64_t display_id_ = 0;

  bool display_ownership_ = false;
  bool camera_setup_ = false;
  std::unique_ptr<fsl::DeviceWatcher> camera_watcher_;

  fuchsia::camera::ControlPtr camera_control_;
  fuchsia::camera::StreamPtr camera_stream_;
  zx::eventpair stream_token_;
  uint8_t* camera_buffers_[kMaxFrames];
  uint32_t camera_stride_;
  uint32_t width_;
  uint32_t height_;

  std::unique_ptr<Context> test_context_;
  std::vector<std::vector<std::pair<LayerImpl*, const void*>>> frames_;
  uint32_t display_idx_ = 0;
  uint32_t capture_idx_ = 0;
  uint32_t bad_capture_count_ = 0;
  bool test_running_ = false;
  int32_t test_status_ = kTestStatusUnknown;

  std::vector<uint32_t> buffer_ids_;
};

}  // namespace internal
}  // namespace display_test

#endif  // GARNET_BIN_DISPLAY_CAPTURE_TEST_RUNNER_H_
