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

#include <algorithm>
#include <tuple>
#include <utility>

#include "cmGeneratorTarget.h"
#include "cmLocalGenerator.h"
#include "cmMessageType.h"
#include "cmStringAlgorithms.h"
#include "cmTarget.h"
#include "cmTargetExport.h"

cmExportSet::cmExportSet(std::string name)
  : Name(std::move(name))
{
}

cmExportSet::~cmExportSet() = default;

bool cmExportSet::Compute(cmLocalGenerator* lg)
{
  for (std::unique_ptr<cmTargetExport>& tgtExport : this->TargetExports) {
    tgtExport->Target = lg->FindGeneratorTargetToUse(tgtExport->TargetName);

    auto const interfaceFileSets =
      tgtExport->Target->Target->GetAllInterfaceFileSets();
    auto const fileSetInTargetExport =
      [&tgtExport, lg](const std::string& fileSetName) -> bool {
      auto* fileSet = tgtExport->Target->Target->GetFileSet(fileSetName);

      if (!tgtExport->FileSetGenerators.count(fileSet)) {
        lg->IssueMessage(MessageType::FATAL_ERROR,
                         cmStrCat("File set \"", fileSetName,
                                  "\" is listed in interface file sets of ",
                                  tgtExport->Target->GetName(),
                                  " but has not been exported"));
        return false;
      }
      return true;
    };

    if (!std::all_of(interfaceFileSets.begin(), interfaceFileSets.end(),
                     fileSetInTargetExport)) {
      return false;
    }
  }

  return true;
}

void cmExportSet::AddTargetExport(std::unique_ptr<cmTargetExport> te)
{
  this->TargetExports.emplace_back(std::move(te));
}

void cmExportSet::AddInstallation(cmInstallExportGenerator const* installation)
{
  this->Installations.push_back(installation);
}

cmExportSet& cmExportSetMap::operator[](const std::string& name)
{
  auto it = this->find(name);
  if (it == this->end()) // Export set not found
  {
    auto tup_name = std::make_tuple(name);
    it = this->emplace(std::piecewise_construct, tup_name, tup_name).first;
  }
  return it->second;
}
