// Copyright 2013 The Flutter Authors. 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:flutter_test/flutter_test.dart';
import 'package:go_router/src/path_utils.dart';

void main() {
  test('patternToRegExp without path parameter', () async {
    const String pattern = '/settings/detail';
    final List<String> pathParameter = <String>[];
    final RegExp regex = patternToRegExp(pattern, pathParameter);
    expect(pathParameter.isEmpty, isTrue);
    expect(regex.hasMatch('/settings/detail'), isTrue);
    expect(regex.hasMatch('/settings/'), isFalse);
    expect(regex.hasMatch('/settings'), isFalse);
    expect(regex.hasMatch('/'), isFalse);
    expect(regex.hasMatch('/settings/details'), isFalse);
    expect(regex.hasMatch('/setting/detail'), isFalse);
  });

  test('patternToRegExp with path parameter', () async {
    const String pattern = '/user/:id/book/:bookId';
    final List<String> pathParameter = <String>[];
    final RegExp regex = patternToRegExp(pattern, pathParameter);
    expect(pathParameter.length, 2);
    expect(pathParameter[0], 'id');
    expect(pathParameter[1], 'bookId');

    final RegExpMatch? match = regex.firstMatch('/user/123/book/456/');
    expect(match, isNotNull);
    final Map<String, String> parameterValues =
        extractPathParameters(pathParameter, match!);
    expect(parameterValues.length, 2);
    expect(parameterValues[pathParameter[0]], '123');
    expect(parameterValues[pathParameter[1]], '456');

    expect(regex.hasMatch('/user/123/book/'), isFalse);
    expect(regex.hasMatch('/user/123'), isFalse);
    expect(regex.hasMatch('/user/'), isFalse);
    expect(regex.hasMatch('/'), isFalse);
  });

  test('patternToPath without path parameter', () async {
    const String pattern = '/settings/detail';
    final List<String> pathParameter = <String>[];
    final RegExp regex = patternToRegExp(pattern, pathParameter);

    const String url = '/settings/detail';
    final RegExpMatch? match = regex.firstMatch(url);
    expect(match, isNotNull);

    final Map<String, String> parameterValues =
        extractPathParameters(pathParameter, match!);
    final String restoredUrl = patternToPath(pattern, parameterValues);

    expect(url, restoredUrl);
  });

  test('patternToPath with path parameter', () async {
    const String pattern = '/user/:id/book/:bookId';
    final List<String> pathParameter = <String>[];
    final RegExp regex = patternToRegExp(pattern, pathParameter);

    const String url = '/user/123/book/456';
    final RegExpMatch? match = regex.firstMatch(url);
    expect(match, isNotNull);

    final Map<String, String> parameterValues =
        extractPathParameters(pathParameter, match!);
    final String restoredUrl = patternToPath(pattern, parameterValues);

    expect(url, restoredUrl);
  });

  test('concatenatePaths', () {
    void verify(String pathA, String pathB, String expected) {
      final String result = concatenatePaths(pathA, pathB);
      expect(result, expected);
    }

    void verifyThrows(String pathA, String pathB) {
      expect(
          () => concatenatePaths(pathA, pathB), throwsA(isA<AssertionError>()));
    }

    verify('/a', 'b/c', '/a/b/c');
    verify('/', 'b', '/b');
    verifyThrows('/a', '/b');
    verifyThrows('/a', '/');
    verifyThrows('/', '/');
    verifyThrows('/', '');
    verifyThrows('', '');
  });

  test('canonicalUri', () {
    void verify(String path, String expected) =>
        expect(canonicalUri(path), expected);
    verify('/a', '/a');
    verify('/a/', '/a');
    verify('/', '/');
    verify('/a/b/', '/a/b');

    expect(() => canonicalUri('::::'), throwsA(isA<FormatException>()));
    expect(() => canonicalUri(''), throwsA(anything));
  });
}
