// 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:convert';

import 'package:http/http.dart' as http;
import 'package:package_config/packages_file.dart' as packages_file;

// ignore: uri_does_not_exist
import 'utils_io_stub.dart'
    // ignore: uri_does_not_exist
    if (dart.library.io) 'utils_io.dart' as io;
// ignore: uri_does_not_exist
import 'utils_isolate_stub.dart'
    // ignore: uri_does_not_exist
    if (dart.library.isolate) 'utils_isolate.dart' as isolate;

/// Loads the configuration map from [uri].
///
/// This supports `http`, `file`, `data`, and `package` URIs. If [client] is
/// passed and an HTTP request is needed, it's used to make that request;
/// otherwise, a default client is used.
Future<Map<String, Uri>> loadConfigMap(Uri uri, {http.Client client}) async {
  var resolved = Uri.base.resolveUri(uri);

  var text;
  if (resolved.scheme == 'http') {
    text = await (client == null ? http.read(resolved) : client.read(resolved));
  } else if (resolved.scheme == 'file') {
    text = await io.readFileAsString(resolved);
  } else if (resolved.scheme == 'data') {
    text = resolved.data.contentAsString();
  } else if (resolved.scheme == 'package') {
    return loadConfigMap(await isolate.resolvePackageUri(uri), client: client);
  } else {
    throw UnsupportedError(
        'PackageInfo.loadConfig doesn\'t support URI scheme "${uri.scheme}:".');
  }

  return packages_file.parse(utf8.encode(text), resolved);
}

/// Converts [uri] to a [Uri] and verifies that it's a valid `package:` URI.
///
/// Throws an [ArgumentError] if [uri] isn't a [String] or a [Uri]. [name] is
/// used as the argument name in that error.
///
/// Throws a [FormatException] if [uri] isn't a `package:` URI or doesn't have
/// at least one path segment.
Uri asPackageUri(uri, String name) {
  uri = asUri(uri, name);

  if (uri.scheme != 'package') {
    throw FormatException(
        "Can only resolve a package: URI.", uri.toString(), 0);
  } else if (uri.pathSegments.isEmpty) {
    throw FormatException(
        "Expected package name.", uri.toString(), "package:".length);
  }

  return uri;
}

/// Converts [uri] to a [Uri].
///
/// Throws an [ArgumentError] if [uri] isn't a [String] or a [Uri]. [name] is
/// used as the argument name in that error.
Uri asUri(uri, String name) {
  if (uri is Uri) return uri;
  if (uri is String) return Uri.parse(uri);

  throw ArgumentError.value(uri, name, "Must be a String or a Uri.");
}

/// Returns a copy of [uri] with a trailing slash.
///
/// If [uri] already ends in a slash, returns it as-is.
Uri ensureTrailingSlash(Uri uri) {
  if (uri.pathSegments.isEmpty) return uri.replace(path: "/");
  if (uri.pathSegments.last.isEmpty) return uri;
  return uri.replace(pathSegments: uri.pathSegments.toList()..add(""));
}

String packagePathForRoot(String package, Uri root) =>
    io.packagePathForRoot(package, root);
