// 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 "starboard/directory.h"

#include "starboard/shared/win32/directory_internal.h"
#include "starboard/shared/win32/wchar_utils.h"

SbDirectory SbDirectoryOpen(const char* path, SbFileError* out_error) {
  if ((path == nullptr) || (path[0] == '\0')) {
    if (out_error) {
      *out_error = kSbFileErrorNotFound;
    }
    return kSbDirectoryInvalid;
  }

  std::wstring path_wstring = starboard::shared::win32::CStringToWString(path);

  if (!starboard::shared::win32::IsAbsolutePath(path_wstring)) {
    if (out_error) {
      *out_error = kSbFileErrorNotFound;
    }
    return kSbDirectoryInvalid;
  }

  HANDLE directory_handle = starboard::shared::win32::OpenFileOrDirectory(
      path, kSbFileOpenOnly | kSbFileRead, nullptr, out_error);

  if (!starboard::shared::win32::IsValidHandle(directory_handle)) {
    return kSbDirectoryInvalid;
  }

  FILE_BASIC_INFO basic_info = {0};
  BOOL basic_info_success = GetFileInformationByHandleEx(
      directory_handle, FileBasicInfo, &basic_info, sizeof(FILE_BASIC_INFO));

  if (!basic_info_success ||
      !(basic_info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
    CloseHandle(directory_handle);
    if (out_error) {
      *out_error = kSbFileErrorNotADirectory;
    }
    return kSbDirectoryInvalid;
  }

  return new SbDirectoryPrivate(directory_handle);
}
