// Copyright 2020 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "testing/embedder_test_environment.h"

#include <ostream>

#include "core/fxcrt/check.h"
#include "core/fxcrt/fx_system.h"
#include "public/fpdfview.h"
#include "testing/command_line_helpers.h"

#ifdef PDF_ENABLE_V8
#include "testing/v8_test_environment.h"
#endif  // PDF_ENABLE_V8

namespace {

EmbedderTestEnvironment* g_environment = nullptr;

}  // namespace

EmbedderTestEnvironment::EmbedderTestEnvironment()
    : renderer_type_(GetDefaultRendererType()) {
  DCHECK(!g_environment);
  g_environment = this;
}

EmbedderTestEnvironment::~EmbedderTestEnvironment() {
  DCHECK(g_environment);
  g_environment = nullptr;
}

// static
EmbedderTestEnvironment* EmbedderTestEnvironment::GetInstance() {
  return g_environment;
}

void EmbedderTestEnvironment::SetUp() {
  FPDF_LIBRARY_CONFIG config = {
      .version = 5,
      .m_pUserFontPaths = test_fonts_.font_paths(),

#ifdef PDF_ENABLE_V8
      .m_pIsolate = V8TestEnvironment::GetInstance()->isolate(),
      .m_v8EmbedderSlot = 0,
      .m_pPlatform = V8TestEnvironment::GetInstance()->platform(),
#else   // PDF_ENABLE_V8
      .m_pIsolate = nullptr,
      .m_v8EmbedderSlot = 0,
      .m_pPlatform = nullptr,
#endif  // PDF_ENABLE_V8

      .m_RendererType = renderer_type_,
      .m_FontLibraryType = fontations_ ? FPDF_FONTBACKENDTYPE_FONTATIONS
                                       : FPDF_FONTBACKENDTYPE_FREETYPE,
  };

  FPDF_InitLibraryWithConfig(&config);

  test_fonts_.InstallFontMapper();
}

void EmbedderTestEnvironment::TearDown() {
  FPDF_DestroyLibrary();
}

void EmbedderTestEnvironment::AddFlags(int argc, char** argv) {
  for (int i = 1; i < argc; ++i) {
    AddFlag(argv[i]);
  }
  CHECK(CheckFlags());
}

void EmbedderTestEnvironment::AddFlag(const std::string& flag) {
  if (flag == "--write-pngs") {
    write_pngs_ = true;
    return;
  }

#if defined(PDF_USE_SKIA)
  std::string value;
  if (ParseSwitchKeyValue(flag, "--use-renderer=", &value)) {
    if (value == "agg") {
      renderer_type_ = FPDF_RENDERERTYPE_AGG;
    } else if (value == "skia") {
      renderer_type_ = FPDF_RENDERERTYPE_SKIA;
    } else {
      std::cerr << "Invalid --use-renderer argument, value must be one of agg "
                   "or skia\n";
    }
    return;
  }
  if (flag == "--fontations") {
    fontations_ = true;
    return;
  }
#endif  // defined(PDF_USE_SKIA)

  std::cerr << "Unknown flag: " << flag << "\n";
}

bool EmbedderTestEnvironment::CheckFlags() {
  if (fontations_ && renderer_type_ != FPDF_RENDERERTYPE_SKIA) {
    std::cerr << "--fontations requires --use-renderer=skia as well.\n";
    return false;
  }
  return true;
}
