// Copyright 2022 Google LLC
// SPDX-License-Identifier: BSD-2-Clause
// Compares two files and returns whether they are the same once decoded.

#include <iostream>
#include <string>

#include "aviftest_helpers.h"
#include "avifutil.h"

using libavif::testutil::AvifImagePtr;

int main(int argc, char** argv) {
  if (argc != 4) {
    std::cerr << "Wrong argument: " << argv[0]
              << " file1 file2 ignore_alpha_flag" << std::endl;
    return 2;
  }
  AvifImagePtr decoded[2] = {
      AvifImagePtr(avifImageCreateEmpty(), avifImageDestroy),
      AvifImagePtr(avifImageCreateEmpty(), avifImageDestroy)};
  if (!decoded[0] || !decoded[1]) {
    std::cerr << "Cannot create AVIF images." << std::endl;
    return 2;
  }
  uint32_t depth[2];
  // Request the bit depth closest to the bit depth of the input file.
  constexpr int kRequestedDepth = 0;
  constexpr avifPixelFormat requestedFormat = AVIF_PIXEL_FORMAT_NONE;
  for (int i : {0, 1}) {
    // Make sure no color conversion happens.
    decoded[i]->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_IDENTITY;
    if (avifReadImage(argv[i + 1], requestedFormat, kRequestedDepth,
                      AVIF_CHROMA_DOWNSAMPLING_AUTOMATIC,
                      /*ignoreICC=*/AVIF_FALSE, /*ignoreExif=*/AVIF_FALSE,
                      /*ignoreXMP=*/AVIF_FALSE, decoded[i].get(), &depth[i],
                      nullptr, nullptr) == AVIF_APP_FILE_FORMAT_UNKNOWN) {
      std::cerr << "Image " << argv[i + 1] << " cannot be read." << std::endl;
      return 2;
    }
  }

  if (depth[0] != depth[1]) {
    std::cerr << "Images " << argv[1] << " and " << argv[2]
              << " have different depths." << std::endl;
    return 1;
  }
  if (!libavif::testutil::AreImagesEqual(*decoded[0], *decoded[1],
                                         std::stoi(argv[3]) != 0)) {
    std::cerr << "Images " << argv[1] << " and " << argv[2] << " are different."
              << std::endl;
    return 1;
  }
  std::cout << "Images " << argv[1] << " and " << argv[2] << " are identical."
            << std::endl;
  return 0;
}
