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

#include "cmAlgorithms.h"
#include "cmPolicies.h"

class cmFileSet;
class cmGlobalGenerator;
class cmMakefile;
class cmTarget;
class cmTest;

namespace cmDebugger {
class cmDebuggerStackFrame;
class cmDebuggerVariables;
class cmDebuggerVariablesManager;
}

template <typename T>
class BT;

namespace cmDebugger {

class cmDebuggerVariablesHelper
{
  cmDebuggerVariablesHelper() = default;

public:
  static std::shared_ptr<cmDebuggerVariables> Create(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    cmPolicies::PolicyMap const& policyMap);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::vector<std::pair<std::string, std::string>> const& list);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    cmBTStringRange const& entries);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::set<std::string> const& values);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::vector<std::string> const& values);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::vector<BT<std::string>> const& list);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType, cmFileSet* fileSet);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::vector<cmFileSet*> const& fileSets);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType, cmTest* test);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::vector<cmTest*> const& tests);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::vector<cmTarget*> const& targets);

  static std::shared_ptr<cmDebuggerVariables> Create(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    std::shared_ptr<cmDebuggerStackFrame> const& frame);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType, cmMakefile* mf);

  static std::shared_ptr<cmDebuggerVariables> CreateIfAny(
    std::shared_ptr<cmDebuggerVariablesManager> const& variablesManager,
    std::string const& name, bool supportsVariableType,
    cmGlobalGenerator* gen);
};

} // namespace cmDebugger
