// Copyright (c) 2012, 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 uri_extras;

import 'dart:math';

String relativize(Uri base, Uri uri, bool isWindows) {
  bool equalsNCS(String a, String b) {
    return a.toLowerCase() == b.toLowerCase();
  }

  if (!equalsNCS(base.scheme, uri.scheme) ||
      equalsNCS(base.scheme, 'dart') ||
      equalsNCS(base.scheme, 'package')) {
    return uri.toString();
  }

  if (!equalsNCS(base.scheme, 'file')) {
    isWindows = false;
  }

  String normalize(String path) {
    if (isWindows) {
      return path.toLowerCase();
    } else {
      return path;
    }
  }

  if (base.userInfo == uri.userInfo &&
      equalsNCS(base.host, uri.host) &&
      base.port == uri.port &&
      uri.query == "" && uri.fragment == "") {
    if (normalize(uri.path).startsWith(normalize(base.path))) {
      return uri.path.substring(base.path.lastIndexOf('/') + 1);
    }

    if (!base.path.startsWith('/') ||
        !uri.path.startsWith('/')) {
      return uri.toString();
    }

    List<String> uriParts = uri.path.split('/');
    List<String> baseParts = base.path.split('/');
    int common = 0;
    int length = min(uriParts.length, baseParts.length);
    while (common < length &&
           normalize(uriParts[common]) == normalize(baseParts[common])) {
      common++;
    }
    if (common == 1 || (isWindows && common == 2)) {
      // The first part will always be an empty string because the
      // paths are absolute. On Windows, we must also consider drive
      // letters or hostnames.
      if (baseParts.length > common + 1) {
        // Avoid using '..' to go to the root, unless we are already there.
        return uri.path;
      }
    }
    StringBuffer sb = new StringBuffer();
    for (int i = common + 1; i < baseParts.length; i++) {
      sb.write('../');
    }
    for (int i = common; i < uriParts.length - 1; i++) {
      sb.write('${uriParts[i]}/');
    }
    sb.write('${uriParts.last}');
    return sb.toString();
  }
  return uri.toString();
}
