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

#include <sstream>
#include <vector>

#include "cmCTest.h"
#include "cmCTestGenericHandler.h"
#include "cmCTestUploadHandler.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmSystemTools.h"

cmCTestGenericHandler* cmCTestUploadCommand::InitializeHandler()
{
  cmCTestGenericHandler* handler =
    this->CTest->GetInitializedHandler("upload");
  if (!handler) {
    this->SetError("internal CTest error. Cannot instantiate upload handler");
    return nullptr;
  }
  static_cast<cmCTestUploadHandler*>(handler)->SetFiles(this->Files);

  handler->SetQuiet(this->Quiet);
  return handler;
}

bool cmCTestUploadCommand::CheckArgumentKeyword(std::string const& arg)
{
  if (arg == "FILES") {
    this->ArgumentDoing = ArgumentDoingFiles;
    return true;
  }
  if (arg == "QUIET") {
    this->ArgumentDoing = ArgumentDoingNone;
    this->Quiet = true;
    return true;
  }
  if (arg == "CAPTURE_CMAKE_ERROR") {
    this->ArgumentDoing = ArgumentDoingCaptureCMakeError;
    return true;
  }
  return false;
}

bool cmCTestUploadCommand::CheckArgumentValue(std::string const& arg)
{
  if (this->ArgumentDoing == ArgumentDoingCaptureCMakeError) {
    this->Values[ct_CAPTURE_CMAKE_ERROR] = arg.c_str();
    return true;
  }
  if (this->ArgumentDoing == ArgumentDoingFiles) {
    if (cmSystemTools::FileExists(arg)) {
      this->Files.insert(arg);
      return true;
    }
    std::ostringstream e;
    e << "File \"" << arg << "\" does not exist. Cannot submit "
      << "a non-existent file.";
    this->Makefile->IssueMessage(MessageType::FATAL_ERROR, e.str());
    this->ArgumentDoing = ArgumentDoingError;
    return false;
  }

  // Look for other arguments.
  return this->Superclass::CheckArgumentValue(arg);
}
