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

#include "cmArgumentParser.h"
#include "cmArgumentParserTypes.h"

class cmMakefile;

class cmInstallCommandArguments : public cmArgumentParser<void>
{
public:
  cmInstallCommandArguments(std::string defaultComponent,
                            cmMakefile& makefile);
  void SetGenericArguments(cmInstallCommandArguments* args)
  {
    this->GenericArguments = args;
  }

  // Compute destination path and check permissions.
  bool Finalize();

  std::string const& GetDestination() const;
  std::string const& GetComponent() const;
  std::string const& GetNamelinkComponent() const;
  bool GetExcludeFromAll() const;
  std::string const& GetRename() const;
  std::string const& GetPermissions() const;
  std::vector<std::string> const& GetConfigurations() const;
  bool GetOptional() const;
  bool GetNamelinkOnly() const;
  bool GetNamelinkSkip() const;
  bool HasNamelinkComponent() const;
  std::string const& GetType() const;

  std::string const& GetDefaultComponent() const;

  static bool CheckPermissions(std::string const& onePerm, std::string& perm);

private:
  std::string Destination;
  std::string Component;
  std::string NamelinkComponent;
  bool ExcludeFromAll = false;
  std::string Rename;
  ArgumentParser::MaybeEmpty<std::vector<std::string>> Permissions;
  ArgumentParser::MaybeEmpty<std::vector<std::string>> Configurations;
  bool Optional = false;
  bool NamelinkOnly = false;
  bool NamelinkSkip = false;
  std::string Type;

  std::string DestinationString;
  std::string PermissionsString;

  cmInstallCommandArguments* GenericArguments = nullptr;
  static char const* PermissionsTable[];
  static std::string const EmptyString;
  std::string DefaultComponentName;
  bool CheckPermissions();
};

class cmInstallCommandIncludesArgument
{
public:
  cmInstallCommandIncludesArgument();
  void Parse(std::vector<std::string> const* args,
             std::vector<std::string>* unconsumedArgs);

  std::vector<std::string> const& GetIncludeDirs() const;

private:
  std::vector<std::string> IncludeDirs;
};

class cmInstallCommandFileSetArguments : public cmInstallCommandArguments
{
public:
  cmInstallCommandFileSetArguments(std::string defaultComponent,
                                   cmMakefile& makefile);

  void Parse(std::vector<std::string> args,
             std::vector<std::string>* unconsumedArgs);

  std::string const& GetFileSet() const { return this->FileSet; }

private:
  std::string FileSet;
};
