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

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

#include "cmCPackIFWCommon.h"

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

class cmCPackIFWPackage;
class cmCPackIFWRepository;

/** \class cmCPackIFWInstaller
 * \brief A binary installer to be created CPack IFW generator
 */
class cmCPackIFWInstaller : public cmCPackIFWCommon
{
public:
  // Types

  typedef std::map<std::string, cmCPackIFWPackage*> PackagesMap;
  typedef std::vector<cmCPackIFWRepository*> RepositoriesVector;

public:
  // Constructor

  /**
   * Construct installer
   */
  cmCPackIFWInstaller();

public:
  // Configuration

  /// Name of the product being installed
  std::string Name;

  /// Version number of the product being installed
  std::string Version;

  /// Name of the installer as displayed on the title bar
  std::string Title;

  /// Publisher of the software (as shown in the Windows Control Panel)
  std::string Publisher;

  /// URL to a page that contains product information on your web site
  std::string ProductUrl;

  /// Filename for a custom installer icon
  std::string InstallerApplicationIcon;

  /// Filename for a custom window icon
  std::string InstallerWindowIcon;

  /// Filename for a logo
  std::string Logo;

  /// Filename for a watermark
  std::string Watermark;

  /// Filename for a banner
  std::string Banner;

  /// Filename for a background
  std::string Background;

  /// Wizard style name
  std::string WizardStyle;

  /// Wizard width
  std::string WizardDefaultWidth;

  /// Wizard height
  std::string WizardDefaultHeight;

  /// Title color
  std::string TitleColor;

  /// Name of the default program group in the Windows Start menu
  std::string StartMenuDir;

  /// Default target directory for installation
  std::string TargetDir;

  /// Default target directory for installation with administrator rights
  std::string AdminTargetDir;

  /// Filename of the generated maintenance tool
  std::string MaintenanceToolName;

  /// Filename for the configuration of the generated maintenance tool
  std::string MaintenanceToolIniFile;

  /// Set to true if the installation path can contain non-ASCII characters
  std::string AllowNonAsciiCharacters;

  /// Set to false if the target directory should not be deleted when
  /// uninstalling
  std::string RemoveTargetDir;

  /// Set to false if the installation path cannot contain space characters
  std::string AllowSpaceInPath;

  /// Filename for a custom installer control script
  std::string ControlScript;

  /// List of resources to include in the installer binary
  std::vector<std::string> Resources;

public:
  // Internal implementation

  void ConfigureFromOptions();

  void GenerateInstallerFile();

  void GeneratePackageFiles();

  PackagesMap Packages;
  RepositoriesVector RemoteRepositories;
  std::string Directory;

protected:
  void printSkippedOptionWarning(const std::string& optionName,
                                 const std::string& optionValue);
};

#endif // cmCPackIFWInstaller_h
