// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import "dart:async" show Future, Stream;
import "dart:convert" show Encoding;
import "dart:html";
import "dart:typed_data" show ByteBuffer;

/// Reads the bytes of a URI as a stream of bytes.
Stream<List<int>> readAsStream(Uri uri) async* {
  // TODO(lrn): Should file be run through XmlHTTPRequest too?
  if (uri.scheme == "http" || uri.scheme == "https") {
    // TODO: Stream in chunks if DOM has a way to do so.
    List<int> response = await _httpGetBytes(uri);
    yield response;
    return;
  }
  if (uri.scheme == "data") {
    yield uri.data.contentAsBytes();
    return;
  }
  throw new UnsupportedError("Unsupported scheme: $uri");
}

/// Reads the bytes of a URI as a list of bytes.
Future<List<int>> readAsBytes(Uri uri) async {
  if (uri.scheme == "http" || uri.scheme == "https") {
    return _httpGetBytes(uri);
  }
  if (uri.scheme == "data") {
    return uri.data.contentAsBytes();
  }
  throw new UnsupportedError("Unsupported scheme: $uri");
}

/// Reads the bytes of a URI as a string.
Future<String> readAsString(Uri uri, Encoding encoding) async {
  if (uri.scheme == "http" || uri.scheme == "https") {
    // Fetch as string if the encoding is expected to be understood,
    // otherwise fetch as bytes and do decoding using the encoding.
    if (encoding != null) {
      return encoding.decode(await _httpGetBytes(uri));
    }
    return HttpRequest.getString(uri.toString());
  }
  if (uri.scheme == "data") {
    return uri.data.contentAsString(encoding: encoding);
  }
  throw new UnsupportedError("Unsupported scheme: $uri");
}

Future<List<int>> _httpGetBytes(Uri uri) {
  return HttpRequest
      .request(uri.toString(), responseType: "arraybuffer")
      .then((request) {
    ByteBuffer data = request.response;
    return data.asUint8List();
  });
}
