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

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

#include <set>
#include <sstream>
#include <string>

#include "cmCPackComponentGroup.h"
#include "cmCPackGenerator.h"

class cmXMLWriter;

/** \class cmCPackPKGGenerator
 * \brief A generator for pkg files
 *
 */
class cmCPackPKGGenerator : public cmCPackGenerator
{
public:
  cmCPackTypeMacro(cmCPackPKGGenerator, cmCPackGenerator);

  /**
   * Construct generator
   */
  cmCPackPKGGenerator();
  ~cmCPackPKGGenerator() override;

  bool SupportsComponentInstallation() const override;

protected:
  int InitializeInternal() override;
  const char* GetOutputPostfix() override { return "darwin"; }

  // Copies or creates the resource file with the given name to the
  // package or package staging directory dirName. The variable
  // CPACK_RESOURCE_FILE_${NAME} (where ${NAME} is the uppercased
  // version of name) specifies the input file to use for this file,
  // which will be configured via ConfigureFile.
  bool CopyCreateResourceFile(const std::string& name,
                              const std::string& dirName);
  bool CopyResourcePlistFile(const std::string& name, const char* outName = 0);

  int CopyInstallScript(const std::string& resdir, const std::string& script,
                        const std::string& name);

  // Retrieve the name of package file that will be generated for this
  // component. The name is just the file name with extension, and
  // does not include the subdirectory.
  std::string GetPackageName(const cmCPackComponent& component);

  // Writes a distribution.dist file, which turns a metapackage into a
  // full-fledged distribution. This file is used to describe
  // inter-component dependencies. metapackageFile is the name of the
  // metapackage for the distribution. Only valid for a
  // component-based install.
  void WriteDistributionFile(const char* metapackageFile);

  // Subroutine of WriteDistributionFile that writes out the
  // dependency attributes for inter-component dependencies.
  void AddDependencyAttributes(const cmCPackComponent& component,
                               std::set<const cmCPackComponent*>& visited,
                               std::ostringstream& out);

  // Subroutine of WriteDistributionFile that writes out the
  // reverse dependency attributes for inter-component dependencies.
  void AddReverseDependencyAttributes(
    const cmCPackComponent& component,
    std::set<const cmCPackComponent*>& visited, std::ostringstream& out);

  // Generates XML that encodes the hierarchy of component groups and
  // their components in a form that can be used by distribution
  // metapackages.
  void CreateChoiceOutline(const cmCPackComponentGroup& group,
                           cmXMLWriter& xout);

  /// Create the "choice" XML element to describe a component group
  /// for the installer GUI.
  void CreateChoice(const cmCPackComponentGroup& group, cmXMLWriter& xout);

  /// Create the "choice" XML element to describe a component for the
  /// installer GUI.
  void CreateChoice(const cmCPackComponent& component, cmXMLWriter& xout);

  // The PostFlight component when creating a metapackage
  cmCPackComponent PostFlightComponent;
};

#endif
