// Copyright 2022 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_UI_TESTING_UTIL_SCREENSHOT_HELPER_H_
#define SRC_UI_TESTING_UTIL_SCREENSHOT_HELPER_H_

#include <lib/syslog/cpp/macros.h>
#include <lib/zx/vmo.h>
#include <zircon/status.h>

#include <map>
#include <vector>

#include "src/ui/scenic/lib/utils/pixel.h"

namespace ui_testing {

using Pixel = utils::Pixel;

// Helper class to get information about a screenshot returned by
// |fuchsia.ui.composition.Screenshot| protocol.
class Screenshot {
 public:
  // Params:-
  // |screenshot_vmo| - The VMO returned by |fuchsia.ui.composition.Screenshot.Take| representing
  //                    the screenshot data in BGRA.
  // |width|, |height| - Width and height of the physical display in pixels as
  //                     returned by |fuchsia.ui.display.singleton.Info|.
  // |rotation| - The display rotation value in degrees. The width and the height of the screenshot
  //              are flipped if this value is 90 or 270 degrees as the screenshot shows how content
  //              is seen by the user.
  Screenshot(const zx::vmo& screenshot_vmo, uint64_t width, uint64_t height, int rotation);

  // Use this specifically to create a |Screenshot| object from a PNG encoded vmo.
  explicit Screenshot(const zx::vmo& png_vmo);

  // An empty screenshot.
  Screenshot();

  // Returns the |Pixel| located at (x,y) coordinates. |x| and |y| should range from [0,width_) and
  // [0,height_) respectively.
  //
  //  (0,0)________________width_____________(w-1,0)
  //      |                       |         |
  //      |                       | y       |h
  //      |          x            |         |e
  //      |-----------------------X         |i
  //      |                                 |g
  //      |                                 |h
  //      |                                 |t
  //      |_________________________________|
  //(0,h-1)           screenshot             (w-1,h-1)
  //
  // Clients should only use this function to get the pixel data.
  Pixel GetPixelAt(uint64_t x, uint64_t y) const;

  // Counts the frequencies of each color in a screenshot.
  std::map<Pixel, uint32_t> Histogram() const;

  // Returns percentage of pixels that match by comparing two screenshots. Returns 0 if the sizes of
  // the screenshots do not match.
  float ComputeSimilarity(const Screenshot& other) const;

  // Returns percentage of pixels that match by comparing the histograms of two screenshots,
  // allowing for pixel movement (e.g. shift, rotation) in the image. The comparison is
  // performed by measuring the percentage of the area of the histograms that overlaps,
  // i.e. the number of pixels that are both histograms.
  // Returns 0 if the sizes of the screenshots do not match.
  float ComputeHistogramSimilarity(const Screenshot& other) const;

  // Returns a 2D vector of size |height_ * width_|. Each value in the vector corresponds to a pixel
  // in the screenshot.
  std::vector<std::vector<Pixel>> screenshot() const { return screenshot_; }

  uint64_t width() const { return width_; }

  uint64_t height() const { return height_; }

  // Loads the screenshot from a PNG file.
  bool LoadFromPng(const std::string& png_filename);

  // Dumps the screenshot as a BGRA raw file to /custom_artifacts. Returns true if it is successful.
  // Note that the custom_artifacts storage capability needs to be added to the test. See
  // https://fuchsia.dev/fuchsia-src/development/testing/components/test_runner_framework?hl=en#custom-artifacts
  // for more details.
  bool DumpToCustomArtifacts(const std::string& filename = "screenshot.bgra") const;

  // Dumps the screenshot as a PNG file to /custom_artifacts. Returns true if it is successful.
  // Note that the custom_artifacts storage capability needs to be added to the test. See
  // https://fuchsia.dev/fuchsia-src/development/testing/components/test_runner_framework?hl=en#custom-artifacts
  // for more details.
  bool DumpPngToCustomArtifacts(const std::string& filename = "screenshot.png") const;

  // Returns the top pixels in the histogram and prints logs.
  std::vector<std::pair<uint32_t, utils::Pixel>> LogHistogramTopPixels(
      int num_top_pixels = 10) const;

  void ExtractScreenshotFromPngVMO(zx::vmo& png_vmo);

 private:
  // Populates |screenshot_| by converting the linear array of bytes in |screenshot_vmo| of size |4
  // * width_ * height_| to a 2D vector of |Pixel|s of size |height_ * width_|.
  // Note: Size of each pixel is 4 bytes.
  void ExtractScreenshotFromVMO(uint8_t* screenshot_vmo);

  // Returns the |Pixel|s in the |row_index| row of the screenshot.
  std::vector<Pixel> GetPixelsInRow(uint8_t* screenshot_vmo, size_t row_index);

  uint64_t width_ = 0;
  uint64_t height_ = 0;
  std::vector<std::vector<Pixel>> screenshot_;
};

}  // namespace ui_testing

#endif  // SRC_UI_TESTING_UTIL_SCREENSHOT_HELPER_H_
