/* 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 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
