// Copyright (c) 2018, 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:file/file.dart';
import 'package:path/path.dart' as p;

/// Class that represents the path style that a memory file system should
/// adopt.
///
/// This is primarily useful if you want to test how your code will behave
/// when faced with particular paths or particular path separator characters.
/// For instance, you may want to test that your code will work on Windows,
/// while still using a memory file system in order to gain hermeticity in your
/// tests.
abstract class FileSystemStyle {
  const FileSystemStyle._();

  /// Mimics the Unix file system style.
  ///
  /// * This style does not have the notion of drives
  /// * All file system paths are rooted at `/`
  /// * The path separator is `/`
  ///
  /// An example path in this style is `/path/to/file`.
  static const FileSystemStyle posix = const _Posix();

  /// Mimics the Windows file system style.
  ///
  /// * This style mounts its root folder on a single root drive (`C:`)
  /// * All file system paths are rooted at `C:\`
  /// * The path separator is `\`
  ///
  /// An example path in this style is `C:\path\to\file`.
  static const FileSystemStyle windows = const _Windows();

  /// The drive upon which the root directory is mounted.
  ///
  /// While real-world file systems that have the notion of drives will support
  /// multiple drives per system, memory file system will only support one
  /// root drive.
  ///
  /// This will be the empty string for styles that don't have the notion of
  /// drives (e.g. [posix]).
  String get drive;

  /// The String that represents the delineation between a directory and its
  /// children.
  String get separator;

  /// The string that represents the root of the file system.
  ///
  /// Memory file system is always single-rooted.
  String get root => '$drive$separator';

  /// Gets an object useful for manipulating paths in this style.
  ///
  /// Relative path manipulations will be relative to the specified [path].
  p.Context contextFor(String path);
}

class _Posix extends FileSystemStyle {
  const _Posix() : super._();

  @override
  String get drive => '';

  @override
  String get separator {
    return p.Style.posix.separator; // ignore: deprecated_member_use
  }

  @override
  p.Context contextFor(String path) =>
      new p.Context(style: p.Style.posix, current: path);
}

class _Windows extends FileSystemStyle {
  const _Windows() : super._();

  @override
  String get drive => 'C:';

  @override
  String get separator {
    return p.Style.windows.separator; // ignore: deprecated_member_use
  }

  @override
  p.Context contextFor(String path) =>
      new p.Context(style: p.Style.windows, current: path);
}

/// A file system that supports different styles.
abstract class StyleableFileSystem implements FileSystem {
  /// The style used by this file system.
  FileSystemStyle get style;
}
