// Copyright 2017 The Cobalt Authors. 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 "starboard/system.h"

#include <winsock2.h>

#include <ifdef.h>
#include <iphlpapi.h>

#include "starboard/shared/win32/adapter_utils.h"

namespace sbwin32 = ::starboard::shared::win32;

namespace {
// Return the connection type of the first "up" ethernet interface,
// or unknown if none found.
SbSystemConnectionType FindConnectionType(PIP_ADAPTER_ADDRESSES adapter) {
  for (; adapter != nullptr; adapter = adapter->Next) {
    if ((adapter->OperStatus != IfOperStatusUp) ||
        !sbwin32::IsIfTypeEthernet(adapter->IfType)) {
      continue;
    }
    // Some devices do not report IfType correctly.
    // So, an extra attempt at determining if an interface is wireless is made.
    if (adapter->IfType == IF_TYPE_IEEE80211 ||
      (wcsstr(adapter->Description, L"WiFi") != nullptr)) {
      return kSbSystemConnectionTypeWireless;
    }
    return kSbSystemConnectionTypeWired;
  }
  return kSbSystemConnectionTypeUnknown;
}
}  // namespace

SbSystemConnectionType SbSystemGetConnectionType() {
  std::unique_ptr<char[]> buffer;
  if (!sbwin32::GetAdapters(kSbSocketAddressTypeIpv4, &buffer)) {
      return kSbSystemConnectionTypeUnknown;
  }
  SbSystemConnectionType result = FindConnectionType(
      reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.get()));
  if (result != kSbSystemConnectionTypeUnknown) {
    return result;
  }
  if (!sbwin32::GetAdapters(kSbSocketAddressTypeIpv6, &buffer)) {
      return kSbSystemConnectionTypeUnknown;
  }
  return FindConnectionType(
      reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.get()));
}
