// Copyright 2017 Google Inc. All Rights Reserved.
//
// 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 <windows.h>

#include <WinSock2.h>

#include <string>
#include <vector>

#include "starboard/configuration.h"
#include "starboard/shared/win32/thread_private.h"
#include "starboard/shared/win32/wchar_utils.h"
#include "starboard/stub/application_stub.h"

using starboard::shared::win32::wchar_tToUTF8;

int main(Platform::Array<Platform::String^>^ args) {
  if (!IsDebuggerPresent()) {
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
    _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
  }

  const int kWinSockVersionMajor = 2;
  const int kWinSockVersionMinor = 2;
  WSAData wsaData;
  int init_result = WSAStartup(
      MAKEWORD(kWinSockVersionMajor, kWinSockVersionMajor), &wsaData);

  SB_CHECK(init_result == 0);
  // WSAStartup returns the highest version that is supported up to the version
  // we request.
  SB_CHECK(LOBYTE(wsaData.wVersion) == kWinSockVersionMajor &&
           HIBYTE(wsaData.wVersion) == kWinSockVersionMinor);

  starboard::shared::win32::RegisterMainThread();

  std::vector<std::string> string_args;
  for (auto it = args->begin(); it != args->end(); ++it) {
    Platform::String^ s = *it;
    string_args.push_back(wchar_tToUTF8(s->Data(), s->Length()));
  }

  std::vector<const char*> utf8_args;
  for (auto it = string_args.begin(); it != string_args.end(); ++it) {
    utf8_args.push_back(it->data());
  }

  starboard::stub::ApplicationStub application;
  int return_value = application.Run(static_cast<int>(utf8_args.size()),
                                     const_cast<char**>(utf8_args.data()));

  WSACleanup();

  return return_value;
}
