// Copyright 2021 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_TINT_FUZZERS_TINT_SPIRV_TOOLS_FUZZER_CLI_H_
#define SRC_TINT_FUZZERS_TINT_SPIRV_TOOLS_FUZZER_CLI_H_

#include <string>
#include <vector>

#include "source/fuzz/fuzzer.h"

namespace tint::fuzzers::spvtools_fuzzer {

/// Default SPIR-V environment that will be used during fuzzing.
const auto kDefaultTargetEnv = SPV_ENV_VULKAN_1_1;

/// The type of the mutator to run.
enum class MutatorType {
  kNone = 0,
  kFuzz = 1 << 0,
  kReduce = 1 << 1,
  kOpt = 1 << 2,
  kAll = kFuzz | kReduce | kOpt
};

inline MutatorType operator|(MutatorType a, MutatorType b) {
  return static_cast<MutatorType>(static_cast<int>(a) | static_cast<int>(b));
}

inline MutatorType operator&(MutatorType a, MutatorType b) {
  return static_cast<MutatorType>(static_cast<int>(a) & static_cast<int>(b));
}

/// Shading language to target during fuzzing.
enum class FuzzingTarget {
  kNone = 0,
  kHlsl = 1 << 0,
  kMsl = 1 << 1,
  kSpv = 1 << 2,
  kWgsl = 1 << 3,
  kAll = kHlsl | kMsl | kSpv | kWgsl
};

inline FuzzingTarget operator|(FuzzingTarget a, FuzzingTarget b) {
  return static_cast<FuzzingTarget>(static_cast<int>(a) | static_cast<int>(b));
}

inline FuzzingTarget operator&(FuzzingTarget a, FuzzingTarget b) {
  return static_cast<FuzzingTarget>(static_cast<int>(a) & static_cast<int>(b));
}

/// These parameters are accepted by various mutators and thus they are accepted
/// by both the fuzzer and the mutator debugger.
struct MutatorCliParams {
  /// SPIR-V target environment for fuzzing.
  spv_target_env target_env = kDefaultTargetEnv;

  /// The number of spirv-fuzz transformations to apply at a time.
  uint32_t transformation_batch_size = 3;

  /// The number of spirv-reduce reductions to apply at a time.
  uint32_t reduction_batch_size = 3;

  /// The number of spirv-opt optimizations to apply at a time.
  uint32_t opt_batch_size = 6;

  /// The vector of donors to use in spirv-fuzz (see the doc for spirv-fuzz to
  /// learn more).
  std::vector<spvtools::fuzz::fuzzerutil::ModuleSupplier> donors = {};

  /// The strategy to use during fuzzing in spirv-fuzz (see the doc for
  /// spirv-fuzz to learn more).
  spvtools::fuzz::RepeatedPassStrategy repeated_pass_strategy =
      spvtools::fuzz::RepeatedPassStrategy::kSimple;

  /// Whether to use all fuzzer passes or a randomly selected subset of them.
  bool enable_all_fuzzer_passes = false;

  /// Whether to use all reduction passes or a randomly selected subset of them.
  bool enable_all_reduce_passes = false;

  /// Whether to validate the SPIR-V binary after each optimization pass.
  bool validate_after_each_opt_pass = true;

  /// Whether to validate the SPIR-V binary after each fuzzer pass.
  bool validate_after_each_fuzzer_pass = true;

  /// Whether to validate the SPIR-V binary after each reduction pass.
  bool validate_after_each_reduce_pass = true;
};

/// Parameters specific to the fuzzer. Type `-tint_help` in the CLI to learn
/// more.
struct FuzzerCliParams {
  /// The size of the cache that records ongoing mutation sessions.
  uint32_t mutator_cache_size = 20;

  /// The type of the mutator to run.
  MutatorType mutator_type = MutatorType::kAll;

  /// Tint backend to fuzz.
  FuzzingTarget fuzzing_target = FuzzingTarget::kAll;

  /// The path to the directory, that will be used to output buggy shaders.
  std::string error_dir = "";

  /// Parameters for various mutators.
  MutatorCliParams mutator_params;
};

/// Parameters specific to the mutator debugger. Type `--help` in the CLI to
/// learn more.
struct MutatorDebuggerCliParams {
  /// The type of the mutator to debug.
  MutatorType mutator_type = MutatorType::kNone;

  /// The seed that was used to initialize the mutator.
  uint32_t seed = 0;

  /// The binary that triggered a bug in the mutator.
  std::vector<uint32_t> original_binary;

  /// Parameters for various mutators.
  MutatorCliParams mutator_params;
};

/// Parses CLI parameters for the fuzzer. This function exits with an error code
/// and a message is printed to the console if some parameter has invalid
/// format. You can pass `-tint_help` to check out all available parameters.
/// This function will remove recognized parameters from the `argv` and adjust
/// the `argc` accordingly.
///
/// @param argc - the number of parameters (identical to the `argc` in `main`
///     function).
/// @param argv - array of C strings of parameters.
/// @return the parsed parameters.
FuzzerCliParams ParseFuzzerCliParams(int* argc, char** argv);

/// Parses CLI parameters for the mutator debugger. This function exits with an
/// error code and a message is printed to the console if some parameter has
/// invalid format. You can pass `--help` to check out all available parameters.
///
/// @param argc - the number of parameters (identical to the `argc` in `main`
///     function).
/// @param argv - array of C strings of parameters.
/// @return the parsed parameters.
MutatorDebuggerCliParams ParseMutatorDebuggerCliParams(int argc,
                                                       const char* const* argv);

}  // namespace tint::fuzzers::spvtools_fuzzer

#endif  // SRC_TINT_FUZZERS_TINT_SPIRV_TOOLS_FUZZER_CLI_H_
