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

#include "cmsys/Directory.hxx"
#include <algorithm>
#include <stddef.h>
#include <utility>

#include "cmAlgorithms.h"
#include "cmMakefile.h"
#include "cmSourceFile.h"
#include "cmSystemTools.h"
#include "cmake.h"

class cmExecutionStatus;

// cmAuxSourceDirectoryCommand
bool cmAuxSourceDirectoryCommand::InitialPass(
  std::vector<std::string> const& args, cmExecutionStatus&)
{
  if (args.size() != 2) {
    this->SetError("called with incorrect number of arguments");
    return false;
  }

  std::string sourceListValue;
  std::string const& templateDirectory = args[0];
  std::string tdir;
  if (!cmSystemTools::FileIsFullPath(templateDirectory)) {
    tdir = this->Makefile->GetCurrentSourceDirectory();
    tdir += "/";
    tdir += templateDirectory;
  } else {
    tdir = templateDirectory;
  }

  // was the list already populated
  const char* def = this->Makefile->GetDefinition(args[1]);
  if (def) {
    sourceListValue = def;
  }

  std::vector<std::string> files;

  // Load all the files in the directory
  cmsys::Directory dir;
  if (dir.Load(tdir)) {
    size_t numfiles = dir.GetNumberOfFiles();
    for (size_t i = 0; i < numfiles; ++i) {
      std::string file = dir.GetFile(static_cast<unsigned long>(i));
      // Split the filename into base and extension
      std::string::size_type dotpos = file.rfind('.');
      if (dotpos != std::string::npos) {
        std::string ext = file.substr(dotpos + 1);
        std::string base = file.substr(0, dotpos);
        // Process only source files
        auto cm = this->Makefile->GetCMakeInstance();
        if (!base.empty() && cm->IsSourceExtension(ext)) {
          std::string fullname = templateDirectory;
          fullname += "/";
          fullname += file;
          // add the file as a class file so
          // depends can be done
          cmSourceFile* sf = this->Makefile->GetOrCreateSource(fullname);
          sf->SetProperty("ABSTRACT", "0");
          files.push_back(std::move(fullname));
        }
      }
    }
  }
  std::sort(files.begin(), files.end());
  if (!sourceListValue.empty()) {
    sourceListValue += ";";
  }
  sourceListValue += cmJoin(files, ";");
  this->Makefile->AddDefinition(args[1], sourceListValue.c_str());
  return true;
}
