import 'dart:async';
import 'dart:io' as io;

import 'package:front_end/src/api_unstable/build_integration.dart';

class HttpAwareFileSystem implements FileSystem {
  FileSystem original;

  HttpAwareFileSystem(this.original);

  @override
  FileSystemEntity entityForUri(Uri uri) {
    if (uri.scheme == 'http' || uri.scheme == 'https') {
      return new HttpFileSystemEntity(this, uri);
    } else {
      return original.entityForUri(uri);
    }
  }
}

class HttpFileSystemEntity implements FileSystemEntity {
  HttpAwareFileSystem fileSystem;
  Uri uri;

  HttpFileSystemEntity(this.fileSystem, this.uri);

  @override
  Future<bool> exists() async {
    return connectAndRun((io.HttpClient httpClient) async {
      io.HttpClientRequest request = await httpClient.headUrl(uri);
      io.HttpClientResponse response = await request.close();
      return response.statusCode == io.HttpStatus.ok;
    });
  }

  @override
  Future<List<int>> readAsBytes() async {
    return connectAndRun((io.HttpClient httpClient) async {
      io.HttpClientRequest request = await httpClient.getUrl(uri);
      io.HttpClientResponse response = await request.close();
      if (response.statusCode != io.HttpStatus.ok) {
        throw new FileSystemException(uri, response.toString());
      }
      List<List<int>> list = await response.toList();
      return list.expand((list) => list).toList();
    });
  }

  @override
  Future<String> readAsString() async {
    return String.fromCharCodes(await readAsBytes());
  }

  T connectAndRun<T>(T body(io.HttpClient httpClient)) {
    io.HttpClient httpClient;
    try {
      httpClient = new io.HttpClient();
      // Set timeout to be shorter than anticipated OS default
      httpClient.connectionTimeout = const Duration(seconds: 5);
      return body(httpClient);
    } on Exception catch (e) {
      throw new FileSystemException(uri, e.toString());
    } finally {
      httpClient?.close(force: true);
    }
  }
}
