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

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

#include "cmFilePathChecksum.h"
#include "cmQtAutoGen.h"
#include "cmsys/RegularExpression.hxx"

#include <map>
#include <set>
#include <string>
#include <vector>

class cmMakefile;

class cmQtAutoGenerators
{
  CM_DISABLE_COPY(cmQtAutoGenerators)
public:
  cmQtAutoGenerators();
  bool Run(const std::string& targetDirectory, const std::string& config);

private:
  // -- Types

  /// @brief Search key plus regular expression pair
  struct KeyRegExp
  {
    KeyRegExp() = default;

    KeyRegExp(const char* key, const char* regExp)
      : Key(key)
      , RegExp(regExp)
    {
    }

    KeyRegExp(const std::string& key, const std::string& regExp)
      : Key(key)
      , RegExp(regExp)
    {
    }

    std::string Key;
    cmsys::RegularExpression RegExp;
  };

  /// @brief RCC job
  struct RccJob
  {
    std::string QrcFile;
    std::string RccFile;
    std::vector<std::string> Options;
    std::vector<std::string> Inputs;
  };

  // -- Configuration
  bool MocDependFilterPush(const std::string& key, const std::string& regExp);
  bool ReadAutogenInfoFile(cmMakefile* makefile,
                           const std::string& targetDirectory,
                           const std::string& config);

  bool MocEnabled() const { return !this->MocExecutable.empty(); }
  bool UicEnabled() const { return !this->UicExecutable.empty(); }
  bool RccEnabled() const { return !this->RccExecutable.empty(); }

  // -- Settings file
  void SettingsFileRead(cmMakefile* makefile);
  bool SettingsFileWrite();

  bool AnySettingsChanged() const
  {
    return (this->MocSettingsChanged || this->RccSettingsChanged ||
            this->UicSettingsChanged);
  }

  // -- Init and run
  void Init(cmMakefile* makefile);
  bool RunAutogen();

  // -- Content analysis
  bool MocRequired(const std::string& contentText,
                   std::string* macroName = nullptr);
  void MocFindDepends(
    const std::string& absFilename, const std::string& contentText,
    std::map<std::string, std::set<std::string>>& mocDepends);

  bool MocSkip(const std::string& absFilename) const;
  bool UicSkip(const std::string& absFilename) const;

  bool ParseSourceFile(
    const std::string& absFilename,
    std::map<std::string, std::string>& mocsIncluded,
    std::map<std::string, std::set<std::string>>& mocDepends,
    std::map<std::string, std::vector<std::string>>& includedUis,
    bool relaxed);

  void SearchHeadersForSourceFile(const std::string& absFilename,
                                  std::set<std::string>& mocHeaderFiles,
                                  std::set<std::string>& uicHeaderFiles) const;

  bool ParseHeaders(
    const std::set<std::string>& mocHeaderFiles,
    const std::set<std::string>& uicHeaderFiles,
    const std::map<std::string, std::string>& mocsIncluded,
    std::map<std::string, std::string>& mocsNotIncluded,
    std::map<std::string, std::set<std::string>>& mocDepends,
    std::map<std::string, std::vector<std::string>>& includedUis);

  void UicParseContent(
    const std::string& fileName, const std::string& contentText,
    std::map<std::string, std::vector<std::string>>& includedUis);

  std::string MocMacroNamesString() const;
  std::string MocHeaderSuffixesString() const;

  bool MocParseSourceContent(
    const std::string& absFilename, const std::string& contentText,
    std::map<std::string, std::string>& mocsIncluded,
    std::map<std::string, std::set<std::string>>& mocDepends, bool relaxed);

  void MocParseHeaderContent(
    const std::string& absFilename, const std::string& contentText,
    std::map<std::string, std::string>& mocsNotIncluded,
    std::map<std::string, std::set<std::string>>& mocDepends);

  // -- Moc file generation
  bool MocGenerateAll(
    const std::map<std::string, std::string>& mocsIncluded,
    const std::map<std::string, std::string>& mocsNotIncluded,
    const std::map<std::string, std::set<std::string>>& mocDepends);
  bool MocGenerateFile(
    const std::string& sourceFile, const std::string& mocFileName,
    const std::map<std::string, std::set<std::string>>& mocDepends,
    bool included);

  // -- Uic file generation
  bool UicFindIncludedFile(std::string& absFile, const std::string& sourceFile,
                           const std::string& searchPath,
                           const std::string& searchFile);
  bool UicGenerateAll(
    const std::map<std::string, std::vector<std::string>>& includedUis);
  bool UicGenerateFile(const std::string& realName,
                       const std::string& uiInputFile,
                       const std::string& uiOutputFile);

  // -- Rcc file generation
  bool RccGenerateAll();
  bool RccGenerateFile(const RccJob& rccJob);

  // -- Log info
  void LogBold(const std::string& message) const;
  void LogInfo(cmQtAutoGen::GeneratorType genType,
               const std::string& message) const;
  // -- Log warning
  void LogWarning(cmQtAutoGen::GeneratorType genType,
                  const std::string& message) const;
  void LogFileWarning(cmQtAutoGen::GeneratorType genType,
                      const std::string& filename,
                      const std::string& message) const;
  // -- Log error
  void LogError(cmQtAutoGen::GeneratorType genType,
                const std::string& message) const;
  void LogFileError(cmQtAutoGen::GeneratorType genType,
                    const std::string& filename,
                    const std::string& message) const;
  void LogCommandError(cmQtAutoGen::GeneratorType genType,
                       const std::string& message,
                       const std::vector<std::string>& command,
                       const std::string& output) const;
  void LogNameCollisionError(
    cmQtAutoGen::GeneratorType genType, const std::string& message,
    const std::multimap<std::string, std::string>& collisions) const;

  // -- Utility
  bool NameCollisionTest(
    const std::map<std::string, std::string>& genFiles,
    std::multimap<std::string, std::string>& collisions) const;
  std::string ChecksumedPath(const std::string& sourceFile,
                             const std::string& basePrefix,
                             const std::string& baseSuffix) const;
  bool MakeParentDirectory(cmQtAutoGen::GeneratorType genType,
                           const std::string& filename) const;
  bool FileDiffers(const std::string& filename, const std::string& content);
  bool FileWrite(cmQtAutoGen::GeneratorType genType,
                 const std::string& filename, const std::string& content);

  bool RunCommand(const std::vector<std::string>& command,
                  std::string& output) const;

  bool FindHeader(std::string& header, const std::string& testBasePath) const;

  std::string MocFindHeader(const std::string& sourcePath,
                            const std::string& includeBase) const;
  bool MocFindIncludedFile(std::string& absFile, const std::string& sourceFile,
                           const std::string& includeString) const;

  // -- Meta
  std::string ConfigSuffix;
  // -- Directories
  std::string ProjectSourceDir;
  std::string ProjectBinaryDir;
  std::string CurrentSourceDir;
  std::string CurrentBinaryDir;
  std::string AutogenBuildDir;
  std::string AutogenIncludeDir;
  // -- Qt environment
  std::string QtMajorVersion;
  std::string QtMinorVersion;
  std::string MocExecutable;
  std::string UicExecutable;
  std::string RccExecutable;
  // -- File lists
  std::vector<std::string> Sources;
  std::vector<std::string> Headers;
  std::vector<std::string> HeaderExtensions;
  cmFilePathChecksum FPathChecksum;
  // -- Settings
  bool IncludeProjectDirsBefore;
  bool Verbose;
  bool ColorOutput;
  std::string SettingsFile;
  std::string SettingsStringMoc;
  std::string SettingsStringUic;
  std::string SettingsStringRcc;
  // -- Moc
  bool MocSettingsChanged;
  bool MocPredefsChanged;
  bool MocRelaxedMode;
  bool MocRunFailed;
  std::string MocCompFileRel;
  std::string MocCompFileAbs;
  std::string MocPredefsFileRel;
  std::string MocPredefsFileAbs;
  std::vector<std::string> MocSkipList;
  std::vector<std::string> MocIncludePaths;
  std::vector<std::string> MocIncludes;
  std::vector<std::string> MocDefinitions;
  std::vector<std::string> MocOptions;
  std::vector<std::string> MocPredefsCmd;
  std::vector<KeyRegExp> MocDependFilters;
  std::vector<KeyRegExp> MocMacroFilters;
  cmsys::RegularExpression MocRegExpInclude;
  // -- Uic
  bool UicSettingsChanged;
  bool UicRunFailed;
  std::vector<std::string> UicSkipList;
  std::vector<std::string> UicTargetOptions;
  std::map<std::string, std::vector<std::string>> UicOptions;
  std::vector<std::string> UicSearchPaths;
  cmsys::RegularExpression UicRegExpInclude;
  // -- Rcc
  bool RccSettingsChanged;
  bool RccRunFailed;
  std::vector<RccJob> RccJobs;
};

#endif
