// Copyright (c) 2015-2016 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "source/print.h"

#if defined(SPIRV_ANDROID) || defined(SPIRV_LINUX) || defined(SPIRV_MAC) || \
    defined(SPIRV_IOS) || defined(SPIRV_TVOS) || defined(SPIRV_FREEBSD) ||  \
    defined(SPIRV_EMSCRIPTEN) || defined(SPIRV_FUCHSIA)
namespace spvtools {

clr::reset::operator const char*() { return "\x1b[0m"; }

clr::grey::operator const char*() { return "\x1b[1;30m"; }

clr::red::operator const char*() { return "\x1b[31m"; }

clr::green::operator const char*() { return "\x1b[32m"; }

clr::yellow::operator const char*() { return "\x1b[33m"; }

clr::blue::operator const char*() { return "\x1b[34m"; }

}  // namespace spvtools
#elif defined(SPIRV_WINDOWS)
#include <windows.h>

namespace spvtools {

static void SetConsoleForegroundColorPrimary(HANDLE hConsole, WORD color) {
  // Get screen buffer information from console handle
  CONSOLE_SCREEN_BUFFER_INFO bufInfo;
  GetConsoleScreenBufferInfo(hConsole, &bufInfo);

  // Get background color
  color = WORD(color | (bufInfo.wAttributes & 0xfff0));

  // Set foreground color
  SetConsoleTextAttribute(hConsole, color);
}

static void SetConsoleForegroundColor(WORD color) {
  SetConsoleForegroundColorPrimary(GetStdHandle(STD_OUTPUT_HANDLE), color);
  SetConsoleForegroundColorPrimary(GetStdHandle(STD_ERROR_HANDLE), color);
}

clr::reset::operator const char*() {
  if (isPrint) {
    SetConsoleForegroundColor(0xf);
    return "";
  }
  return "\x1b[0m";
}

clr::grey::operator const char*() {
  if (isPrint) {
    SetConsoleForegroundColor(FOREGROUND_INTENSITY);
    return "";
  }
  return "\x1b[1;30m";
}

clr::red::operator const char*() {
  if (isPrint) {
    SetConsoleForegroundColor(FOREGROUND_RED);
    return "";
  }
  return "\x1b[31m";
}

clr::green::operator const char*() {
  if (isPrint) {
    SetConsoleForegroundColor(FOREGROUND_GREEN);
    return "";
  }
  return "\x1b[32m";
}

clr::yellow::operator const char*() {
  if (isPrint) {
    SetConsoleForegroundColor(FOREGROUND_RED | FOREGROUND_GREEN);
    return "";
  }
  return "\x1b[33m";
}

clr::blue::operator const char*() {
  // Blue all by itself is hard to see against a black background (the
  // default on command shell), or a medium blue background (the default
  // on PowerShell).  So increase its intensity.

  if (isPrint) {
    SetConsoleForegroundColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    return "";
  }
  return "\x1b[94m";
}

}  // namespace spvtools
#else
namespace spvtools {

clr::reset::operator const char*() { return ""; }

clr::grey::operator const char*() { return ""; }

clr::red::operator const char*() { return ""; }

clr::green::operator const char*() { return ""; }

clr::yellow::operator const char*() { return ""; }

clr::blue::operator const char*() { return ""; }

}  // namespace spvtools
#endif
