/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#pragma once

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

#include <memory>
#include <string>
#include <unordered_map>

#include "cmPlaceholderExpander.h"
#include "cmPropertyMap.h"
#include "cmRule.h"
#include "cmValue.h"

class cmMakefile;
class cmTarget;
class cmFileSet;
class cmSourceFile;
class cmCustomCommand;

class cmGeneratorRule
{
public:
  cmGeneratorRule(cmRule const* rule, cmTarget const* target,
                  cmFileSet const* fileSet, cmFileSet const* outputFileSet,
                  cmSourceFile const* source,
                  cmRule::PatternSet const& patterns);

  cmGeneratorRule(cmGeneratorRule const&) = delete;
  cmGeneratorRule& operator=(cmGeneratorRule const&) = delete;

  cmMakefile& GetMakefile() const { return this->Makefile; }

  /** Get the name of the rule */
  std::string const& GetName() const { return this->Name; }

  cmRule const* GetRule() const { return this->Rule; }
  cmTarget const* GetTarget() const { return this->Target; }

  bool IsGloballyVisible() const { return this->Rule->IsGloballyVisible(); }

  cmValue GetProperty(std::string const& property) const;

  std::unique_ptr<cmCustomCommand> Generate(cmFileSet* outFileSet) const;

private:
  void UpdateRuleExpander(cmRule::PatternSet const& patterns);

  std::unique_ptr<cmCustomCommand> CreateCustomCommand() const;

  std::string Name;
  cmRule const* Rule;
  cmTarget const* Target;
  cmFileSet const* FileSet;
  cmFileSet const* OutputFileSet;
  cmSourceFile const* Source;
  cmMakefile& Makefile;
  mutable cmPropertyMap Properties;

  class RulePlaceholderExpander : public cmPlaceholderExpander
  {
  public:
    using VariableMap = std::unordered_map<std::string, std::string>;
    VariableMap Values;

    std::string ExpandVariables(std::string const& string)
    {
      std::string value{ string };
      return cmPlaceholderExpander::ExpandVariables(
        value, cmPlaceholderExpander::HandleGenex::Yes);
    }

  private:
    std::string ExpandVariable(std::string const& variable) override;
  };

  static RulePlaceholderExpander::VariableMap const DefaultProperties;

  mutable RulePlaceholderExpander RuleExpander;
};
