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

#include <ostream>
#include <string>
#include <utility>

#include "cmSystemTools.h"

cmXCode21Object::cmXCode21Object(PBXType ptype, Type type, std::string id)
  : cmXCodeObject(ptype, type, std::move(id))
{
  this->Version = 21;
}

void cmXCode21Object::PrintComment(std::ostream& out)
{
  if (this->Comment.empty()) {
    cmXCodeObject* n = this->GetAttribute("name");
    if (n) {
      this->Comment = n->GetString();
      cmSystemTools::ReplaceString(this->Comment, "\"", "");
    }
  }
  if (this->Comment.empty()) {
    return;
  }
  out << " /* " << this->Comment << " */";
}

void cmXCode21Object::PrintList(
  std::vector<std::unique_ptr<cmXCodeObject>> const& v, std::ostream& out,
  PBXType t)
{
  bool hasOne = false;
  for (auto const& obj : v) {
    if (obj->GetType() == OBJECT && obj->GetIsA() == t) {
      hasOne = true;
      break;
    }
  }
  if (!hasOne) {
    return;
  }
  out << "\n/* Begin " << PBXTypeNames[t] << " section */\n";
  for (auto const& obj : v) {
    if (obj->GetType() == OBJECT && obj->GetIsA() == t) {
      obj->Print(out);
    }
  }
  out << "/* End " << PBXTypeNames[t] << " section */\n";
}

void cmXCode21Object::PrintList(
  std::vector<std::unique_ptr<cmXCodeObject>> const& v, std::ostream& out)
{
  cmXCodeObject::Indent(1, out);
  out << "objects = {\n";
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXAggregateTarget);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXBuildFile);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXBuildStyle);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXContainerItemProxy);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXFileReference);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXFrameworksBuildPhase);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXGroup);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXHeadersBuildPhase);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXNativeTarget);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXProject);
  cmXCode21Object::PrintList(v, out,
                             cmXCode21Object::PBXShellScriptBuildPhase);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXResourcesBuildPhase);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXSourcesBuildPhase);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXCopyFilesBuildPhase);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXApplicationReference);
  cmXCode21Object::PrintList(v, out,
                             cmXCode21Object::PBXExecutableFileReference);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXLibraryReference);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXToolTarget);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXLibraryTarget);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXTargetDependency);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::XCBuildConfiguration);
  cmXCode21Object::PrintList(v, out, cmXCode21Object::XCConfigurationList);
  cmXCodeObject::Indent(1, out);
  out << "};\n";
}
