#pragma once

#include <ppl.h>
#include <ppltasks.h>
#include <wrl/client.h>

namespace DX {
inline void ThrowIfFailed(HRESULT hr)
{
  if (FAILED(hr)) {
    // Set a breakpoint on this line to catch Win32 API errors.
    throw Platform::Exception::CreateException(hr);
  }
}

// Function that reads from a binary file asynchronously.
inline Concurrency::task<Platform::Array<byte> ^> ReadDataAsync(
  Platform::String ^ filename)
{
  using namespace Windows::Storage;
  using namespace Concurrency;

  auto folder = Windows::ApplicationModel::Package::Current->InstalledLocation;

  return create_task(folder->GetFileAsync(filename))
    .then([](StorageFile ^ file) {
#if !PHONE
      return FileIO::ReadBufferAsync(file);
#else
      return file->OpenReadAsync();
    }).then([](Streams::IRandomAccessStreamWithContentType^ stream)
    {
      unsigned int bufferSize = static_cast<unsigned int>(stream->Size);
      auto fileBuffer = ref new Streams::Buffer(bufferSize);
      return stream->ReadAsync(fileBuffer, bufferSize, Streams::InputStreamOptions::None);
#endif
    })
    .then([](Streams::IBuffer ^ fileBuffer) -> Platform::Array<byte> ^ {
      auto fileData = ref new Platform::Array<byte>(fileBuffer->Length);
      Streams::DataReader::FromBuffer(fileBuffer)->ReadBytes(fileData);
      return fileData;
    });
}
}
