/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */

#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <map>
#include <string>

class cmOutputConverter;

class cmRulePlaceholderExpander
{
public:
  cmRulePlaceholderExpander(
    std::map<std::string, std::string> compilers,
    std::map<std::string, std::string> variableMappings,
    std::string compilerSysroot, std::string linkerSysroot);

  void SetTargetImpLib(std::string const& targetImpLib)
  {
    this->TargetImpLib = targetImpLib;
  }

  // Create a struct to hold the variables passed into
  // ExpandRuleVariables
  struct RuleVariables
  {
    const char* CMTargetName = nullptr;
    const char* CMTargetType = nullptr;
    const char* TargetPDB = nullptr;
    const char* TargetCompilePDB = nullptr;
    const char* TargetVersionMajor = nullptr;
    const char* TargetVersionMinor = nullptr;
    const char* Language = nullptr;
    const char* AIXExports = nullptr;
    const char* Objects = nullptr;
    const char* Target = nullptr;
    const char* LinkLibraries = nullptr;
    const char* Source = nullptr;
    const char* AssemblySource = nullptr;
    const char* PreprocessedSource = nullptr;
    const char* DynDepFile = nullptr;
    const char* Output = nullptr;
    const char* Object = nullptr;
    const char* ObjectDir = nullptr;
    const char* ObjectFileDir = nullptr;
    const char* Flags = nullptr;
    const char* ObjectsQuoted = nullptr;
    const char* SONameFlag = nullptr;
    const char* TargetSOName = nullptr;
    const char* TargetInstallNameDir = nullptr;
    const char* LinkFlags = nullptr;
    const char* Manifests = nullptr;
    const char* LanguageCompileFlags = nullptr;
    const char* Defines = nullptr;
    const char* Includes = nullptr;
    const char* DependencyFile = nullptr;
    const char* DependencyTarget = nullptr;
    const char* FilterPrefix = nullptr;
    const char* SwiftLibraryName = nullptr;
    const char* SwiftModule = nullptr;
    const char* SwiftModuleName = nullptr;
    const char* SwiftOutputFileMap = nullptr;
    const char* SwiftSources = nullptr;
    const char* ISPCHeader = nullptr;
    const char* Fatbinary = nullptr;
    const char* RegisterFile = nullptr;
  };

  // Expand rule variables in CMake of the type found in language rules
  void ExpandRuleVariables(cmOutputConverter* outputConverter,
                           std::string& string,
                           const RuleVariables& replaceValues);

  // Expand rule variables in a single string
  std::string ExpandRuleVariable(cmOutputConverter* outputConverter,
                                 std::string const& variable,
                                 const RuleVariables& replaceValues);

private:
  std::string TargetImpLib;

  std::map<std::string, std::string> Compilers;
  std::map<std::string, std::string> VariableMappings;
  std::string CompilerSysroot;
  std::string LinkerSysroot;
};
