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

#include <cstddef>
#include <utility>

#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"

void cmSlnProjectEntry::AddProjectConfiguration(
  const std::string& solutionConfiguration,
  const std::string& projectConfiguration)
{
  projectConfigurationMap[solutionConfiguration] = projectConfiguration;
}

std::string cmSlnProjectEntry::GetProjectConfiguration(
  const std::string& solutionConfiguration)
{
  return projectConfigurationMap[solutionConfiguration];
}

cm::optional<cmSlnProjectEntry> cmSlnData::GetProjectByGUID(
  const std::string& projectGUID) const
{
  auto it(ProjectsByGUID.find(projectGUID));
  if (it != ProjectsByGUID.end()) {
    return it->second;
  }
  return cm::nullopt;
}

cm::optional<cmSlnProjectEntry> cmSlnData::GetProjectByName(
  const std::string& projectName) const
{
  auto it(ProjectNameIndex.find(projectName));
  if (it != ProjectNameIndex.end()) {
    return it->second->second;
  }
  return cm::nullopt;
}

std::vector<cmSlnProjectEntry> cmSlnData::GetProjects() const
{
  auto it(this->ProjectNameIndex.begin());
  auto itEnd(this->ProjectNameIndex.end());
  std::vector<cmSlnProjectEntry> result;
  for (; it != itEnd; ++it) {
    result.push_back(it->second->second);
  }
  return result;
}

cmSlnProjectEntry* cmSlnData::AddProject(
  const std::string& projectGUID, const std::string& projectName,
  const std::string& projectRelativePath)
{
  auto it(ProjectsByGUID.find(projectGUID));
  if (it != ProjectsByGUID.end()) {
    return nullptr;
  }
  it = ProjectsByGUID
         .insert(ProjectStorage::value_type(
           projectGUID,
           cmSlnProjectEntry(projectGUID, projectName, projectRelativePath)))
         .first;
  ProjectNameIndex[projectName] = it;
  return &it->second;
}

std::string cmSlnData::GetConfigurationTarget(
  const std::string& projectName, const std::string& solutionConfiguration,
  const std::string& platformName)
{
  std::string solutionTarget =
    cmStrCat(solutionConfiguration, '|', platformName);
  cm::optional<cmSlnProjectEntry> project = GetProjectByName(projectName);
  if (!project) {
    return platformName;
  }

  std::string projectTarget = project->GetProjectConfiguration(solutionTarget);
  if (projectTarget.empty()) {
    return platformName;
  }

  std::vector<std::string> targetElements =
    cmSystemTools::SplitString(projectTarget, '|');
  if (targetElements.size() != 2) {
    return platformName;
  }

  return targetElements[1];
}
