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

#include <cerrno>
#include <cstring>

#ifdef _WIN32
#  include <windows.h>
#endif

cmFileLockResult cmFileLockResult::MakeOk()
{
  return { OK, 0 };
}

cmFileLockResult cmFileLockResult::MakeSystem()
{
#if defined(_WIN32)
  Error const lastError = GetLastError();
#else
  Error const lastError = errno;
#endif
  return { SYSTEM, lastError };
}

cmFileLockResult cmFileLockResult::MakeTimeout()
{
  return { TIMEOUT, 0 };
}

cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
{
  return { ALREADY_LOCKED, 0 };
}

cmFileLockResult cmFileLockResult::MakeInternal()
{
  return { INTERNAL, 0 };
}

cmFileLockResult cmFileLockResult::MakeNoFunction()
{
  return { NO_FUNCTION, 0 };
}

bool cmFileLockResult::IsOk() const
{
  return this->Type == OK;
}

std::string cmFileLockResult::GetOutputMessage() const
{
  switch (this->Type) {
    case OK:
      return "0";
    case SYSTEM:
#if defined(_WIN32)
    {
#  define WINMSG_BUF_LEN (1024)
      char winmsg[WINMSG_BUF_LEN];
      DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
      if (FormatMessageA(flags, nullptr, this->ErrorValue,
                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                         (LPSTR)winmsg, WINMSG_BUF_LEN, nullptr)) {
        std::string const message = winmsg;
        return message;
      } else {
        return "Internal error (FormatMessageA failed)";
      }
    }
#else
      return strerror(this->ErrorValue);
#endif
    case TIMEOUT:
      return "Timeout reached";
    case ALREADY_LOCKED:
      return "File already locked";
    case NO_FUNCTION:
      return "'GUARD FUNCTION' not used in function definition";
    case INTERNAL:
    default:
      return "Internal error";
  }
}

cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue)
  : Type(typeValue)
  , ErrorValue(errorValue)
{
}
