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

#include <string>

#include <cm/optional>

#include "cmValue.h"

class cmMakefile;
class cmGeneratorTarget;
class cmStandardLevel;
class cmTarget;

class cmStandardLevelResolver
{

public:
  explicit cmStandardLevelResolver(cmMakefile* makefile)
    : Makefile(makefile)
  {
  }

  std::string GetCompileOptionDef(cmGeneratorTarget const* target,
                                  std::string const& lang,
                                  std::string const& config) const;
  std::string GetEffectiveStandard(cmGeneratorTarget const* target,
                                   std::string const& lang,
                                   std::string const& config) const;

  std::string GetLevelString(std::string const& lang,
                             cmStandardLevel const& level) const;

  bool AddRequiredTargetFeature(cmTarget* target, const std::string& feature,
                                std::string* error = nullptr) const;

  bool CompileFeatureKnown(const std::string& targetName,
                           const std::string& feature, std::string& lang,
                           std::string* error) const;

  cm::optional<cmStandardLevel> CompileFeatureStandardLevel(
    std::string const& lang, std::string const& feature) const;

  cm::optional<cmStandardLevel> LanguageStandardLevel(
    std::string const& lang, std::string const& standardStr) const;

  cmValue CompileFeaturesAvailable(const std::string& lang,
                                   std::string* error) const;

  bool GetNewRequiredStandard(const std::string& targetName,
                              const std::string& feature,
                              cmValue currentLangStandardValue,
                              cm::optional<cmStandardLevel>& featureLevel,
                              std::string& newRequiredStandard,
                              std::string* error = nullptr) const;

  bool HaveStandardAvailable(cmGeneratorTarget const* target,
                             std::string const& lang,
                             std::string const& config,
                             const std::string& feature) const;

  bool IsLaterStandard(std::string const& lang, std::string const& lhs,
                       std::string const& rhs) const;

private:
  bool CheckCompileFeaturesAvailable(const std::string& targetName,
                                     const std::string& feature,
                                     std::string& lang,
                                     std::string* error) const;

  cmMakefile* Makefile;
};
