// 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.
    var response = await _httpGetBytes(uri);
    yield response;
    return;
  }
  if (uri.scheme == 'data') {
    yield uri.data.contentAsBytes();
    return;
  }
  throw 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 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 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();
  });
}
