// Copyright (c) 2014, 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.

library shelf_static.test_util;

import 'dart:async';

import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart';
import 'package:shelf_static/src/util.dart';

final p.Context _ctx = p.url;

/// Makes a simple GET request to [handler] and returns the result.
Future<Response> makeRequest(Handler handler, String path,
    {String scriptName, Map<String, String> headers}) {
  var rootedHandler = _rootHandler(scriptName, handler);
  return syncFuture(() => rootedHandler(_fromPath(path, headers)));
}

Request _fromPath(String path, Map<String, String> headers) =>
    new Request('GET', Uri.parse('http://localhost' + path), headers: headers);

Handler _rootHandler(String scriptName, Handler handler) {
  if (scriptName == null || scriptName.isEmpty) {
    return handler;
  }

  if (!scriptName.startsWith('/')) {
    throw new ArgumentError('scriptName must start with "/" or be empty');
  }

  return (Request request) {
    if (!_ctx.isWithin(scriptName, request.requestedUri.path)) {
      return new Response.notFound('not found');
    }
    assert(request.scriptName.isEmpty);

    var relativePath = _ctx.relative(request.requestedUri.path,
        from: scriptName);

    assert(!relativePath.startsWith('/'));

    relativePath = '/' + relativePath;

    var url = new Uri(path: relativePath, query: request.url.query,
        fragment: request.url.fragment);
    var relativeRequest = _copy(request, scriptName, url);

    return handler(relativeRequest);
  };
}

// TODO: until we have on https://code.google.com/p/dart/issues/detail?id=18453
Request _copy(Request r, String scriptName, Uri url) {
  return new Request(r.method, r.requestedUri,
      protocolVersion: r.protocolVersion, headers: r.headers, url: url,
      scriptName: scriptName, body: r.read(), context: r.context);
}
