// 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/hardware/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::hardware::display::ControllerPtr& display() {
    return display_controller_;
  }
  void OnResourceReady();

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

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

  void InitDisplay();
  void OnDisplaysChanged(
      ::std::vector<fuchsia::hardware::display::Info> added,
      ::std::vector<uint64_t> removed);
  void OnClientOwnershipChange(bool is_owner);
  void OnVsync(uint64_t display_id, uint64_t timestamp,
               ::std::vector<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::hardware::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_
