// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <wordexp.h>

#include "flutter/fml/backtrace.h"
#include "flutter/fml/build_config.h"
#include "flutter/fml/command_line.h"
#include "flutter/fml/logging.h"
#include "flutter/impeller/golden_tests/golden_digest.h"
#include "flutter/impeller/golden_tests/working_directory.h"
#include "gtest/gtest.h"

namespace {
void print_usage() {
  std::cout << "usage: impeller_golden_tests --working_dir=<working_dir>"
            << std::endl
            << std::endl;
  std::cout << "flags:" << std::endl;
  std::cout << "  working_dir: Where the golden images will be generated and "
               "uploaded to Skia Gold from."
            << std::endl;
}
}  // namespace

int main(int argc, char** argv) {
  fml::InstallCrashHandler();
  testing::InitGoogleTest(&argc, argv);
  fml::CommandLine cmd = fml::CommandLineFromPlatformOrArgcArgv(argc, argv);

  std::optional<std::string> working_dir;
  for (const auto& option : cmd.options()) {
    if (option.name == "working_dir") {
      wordexp_t wordexp_result;
      int code = wordexp(option.value.c_str(), &wordexp_result, 0);
      FML_CHECK(code == 0);
      FML_CHECK(wordexp_result.we_wordc != 0);
      working_dir = wordexp_result.we_wordv[0];
      wordfree(&wordexp_result);
    }
  }
  if (!working_dir) {
    std::cout << "required argument \"working_dir\" is missing." << std::endl
              << std::endl;
    print_usage();
    return 1;
  }

  impeller::testing::WorkingDirectory::Instance()->SetPath(working_dir.value());
  std::cout << "working directory: "
            << impeller::testing::WorkingDirectory::Instance()->GetPath()
            << std::endl;

  int return_code = RUN_ALL_TESTS();
  if (0 == return_code) {
    impeller::testing::GoldenDigest::Instance()->Write(
        impeller::testing::WorkingDirectory::Instance());
  }
  return return_code;
}
