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

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

#include <vector>

#include "cmGlobalXCodeGenerator.h"
#include "cmSystemTools.h"
#include "cmXCodeObject.h"
#include "cmXMLWriter.h"

/** \class cmXCodeScheme
 * \brief Write shared schemes for native targets in Xcode project.
 */
class cmXCodeScheme
{
public:
  using TestObjects = std::vector<const cmXCodeObject*>;

  cmXCodeScheme(cmLocalGenerator* lg, cmXCodeObject* xcObj, TestObjects tests,
                const std::vector<std::string>& configList,
                unsigned int xcVersion);

  void WriteXCodeSharedScheme(const std::string& xcProjDir,
                              const std::string& container);

private:
  cmLocalGenerator* const LocalGenerator;
  const cmXCodeObject* const Target;
  const TestObjects Tests;
  const std::string& TargetName;
  const std::vector<std::string>& ConfigList;
  const unsigned int XcodeVersion;

  void WriteXCodeXCScheme(std::ostream& fout, const std::string& container);

  void WriteBuildAction(cmXMLWriter& xout, const std::string& container);
  void WriteTestAction(cmXMLWriter& xout, const std::string& configuration,
                       const std::string& container);
  void WriteLaunchAction(cmXMLWriter& xout, const std::string& configuration,
                         const std::string& container);

  bool WriteLaunchActionAttribute(cmXMLWriter& xout,
                                  const std::string& attrName,
                                  const std::string& varName);

  bool WriteLaunchActionBooleanAttribute(cmXMLWriter& xout,
                                         const std::string& attrName,
                                         const std::string& varName,
                                         bool defaultValue);

  bool WriteLaunchActionAdditionalOption(cmXMLWriter& xout,
                                         const std::string& attrName,
                                         const std::string& value,
                                         const std::string& varName);

  void WriteProfileAction(cmXMLWriter& xout, const std::string& configuration);
  void WriteAnalyzeAction(cmXMLWriter& xout, const std::string& configuration);
  void WriteArchiveAction(cmXMLWriter& xout, const std::string& configuration);

  void WriteBuildableReference(cmXMLWriter& xout, const cmXCodeObject* xcObj,
                               const std::string& container);

  void WriteCustomWorkingDirectory(cmXMLWriter& xout,
                                   const std::string& configuration);

  std::string WriteVersionString();
  std::string FindConfiguration(const std::string& name);

  bool IsTestable() const;

  static bool IsExecutable(const cmXCodeObject* target);
};

#endif
