/* 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 <iosfwd>
#include <string>
#include <vector>

#include "cmInstallGenerator.h"

class cmDiagnosticContext;
class cmLocalGenerator;

/** \class cmInstallDirectoryGenerator
 * \brief Generate directory installation rules.
 */
class cmInstallDirectoryGenerator : public cmInstallGenerator
{
public:
  cmInstallDirectoryGenerator(
    std::vector<std::string> const& dirs, std::string const& dest,
    std::string filePermissions, std::string dirPermissions,
    std::vector<std::string> const& configurations,
    std::string const& component, MessageLevel message, bool excludeFromAll,
    std::string literalArgs, bool optional, cmDiagnosticContext context);
  ~cmInstallDirectoryGenerator() override;

  bool Compute(cmLocalGenerator* lg) override;

  std::string GetDestination(std::string const& config) const;
  std::vector<std::string> GetDirectories(std::string const& config) const;

  bool GetOptional() const { return this->Optional; }

protected:
  void GenerateScriptActions(std::ostream& os, Indent indent) override;
  void GenerateScriptForConfig(std::ostream& os, std::string const& config,
                               Indent indent) override;
  void AddDirectoryInstallRule(std::ostream& os, std::string const& config,
                               Indent indent,
                               std::vector<std::string> const& dirs);
  cmLocalGenerator* LocalGenerator = nullptr;
  std::vector<std::string> const Directories;
  std::string const FilePermissions;
  std::string const DirPermissions;
  std::string const LiteralArguments;
  bool const Optional;
};
