// Copyright (c) 2015, 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 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart';
import 'package:shelf_static/src/util.dart';
import 'package:test/test.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? handlerPath, Map<String, String>? headers}) {
  final rootedHandler = _rootHandler(handlerPath, handler);
  return Future.sync(() => rootedHandler(_fromPath(path, headers)));
}

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

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

  return (Request request) {
    if (!_ctx.isWithin('/$path', request.requestedUri.path)) {
      return Response.notFound('not found');
    }
    assert(request.handlerPath == '/');

    final relativeRequest = request.change(path: path);

    return handler(relativeRequest);
  };
}

Matcher atSameTimeToSecond(DateTime value) =>
    _SecondResolutionDateTimeMatcher(value);

class _SecondResolutionDateTimeMatcher extends Matcher {
  final DateTime _target;

  _SecondResolutionDateTimeMatcher(DateTime target)
      : _target = toSecondResolution(target);

  @override
  bool matches(dynamic item, Map matchState) {
    if (item is! DateTime) return false;

    return _datesEqualToSecond(_target, item);
  }

  @override
  Description describe(Description description) =>
      description.add('Must be at the same moment as $_target with resolution '
          'to the second.');
}

bool _datesEqualToSecond(DateTime d1, DateTime d2) =>
    toSecondResolution(d1).isAtSameMomentAs(toSecondResolution(d2));
