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

/// Manages the directories where tests can appear and the relationships
/// between them.

import 'package:path/path.dart' as p;

const oneRootDirs = const [
  "corelib",
  "html",
  "isolate",
  "language",
  "lib",
  "standalone"
];

const strongRootDirs = const [
  "corelib_strong",
  "language_strong",
  "lib_strong",
];

const twoRootDirs = const ["corelib_2", "language_2", "lib_2", "standalone_2"];

final fromRootDirs = oneRootDirs.toList()..addAll(strongRootDirs);

// Note: The order is significant. "html" and "isolate" need to come first so
// that they don't get handled by the general "lib" directory.
final _directories = [
  new _Directory("corelib", "corelib_strong", "corelib_2"),
  new _Directory("html", p.join("lib_strong", "html"), p.join("lib_2", "html")),
  new _Directory(
      "isolate", p.join("lib_strong", "isolate"), p.join("lib_2", "isolate")),
  new _Directory("language", "language_strong", "language_2"),
  new _Directory("lib", "lib_strong", "lib_2"),
  new _Directory("standalone", "", "standalone_2"),
];

/// Maps a Dart 1.0 or DDC root directory to its resulting migration Dart 2.0
/// directory.
String toTwoDirectory(String fromDir) {
  for (var dir in _directories) {
    if (dir.one == fromDir || dir.strong == fromDir) return dir.two;
  }

  throw new ArgumentError.value(fromDir, "fromDir");
}

/// Given a path within a Dart 1.0 or strong mode directory, returns the
/// corresponding Dart 2.0 path.
String toTwoPath(String fromPath) {
  for (var dir in _directories) {
    if (p.isWithin(dir.one, fromPath)) {
      var relative = p.relative(fromPath, from: dir.one);
      return p.join(dir.two, relative);
    }

    if (p.isWithin(dir.strong, fromPath)) {
      var relative = p.relative(fromPath, from: dir.strong);
      return p.join(dir.two, relative);
    }
  }

  throw new ArgumentError.value(fromPath, "fromPath");
}

/// Given a path within a Dart 2.0 directory, returns the corresponding Dart 1.0
/// path.
String toOnePath(String twoPath) {
  for (var dir in _directories) {
    if (p.isWithin(dir.two, twoPath)) {
      var relative = p.relative(twoPath, from: dir.two);
      return p.join(dir.one, relative);
    }
  }

  throw new ArgumentError.value(twoPath, "twoPath");
}

/// Given a path within a Dart 2.0 directory, returns the corresponding DDC
/// strong mode.
String toStrongPath(String twoPath) {
  for (var dir in _directories) {
    if (p.isWithin(dir.two, twoPath)) {
      var relative = p.relative(twoPath, from: dir.two);
      return p.join(dir.strong, relative);
    }
  }

  throw new ArgumentError.value(twoPath, "twoPath");
}

class _Directory {
  final String one;
  final String strong;
  final String two;

  _Directory(this.one, this.strong, this.two);
}
