// 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.

// @dart=2.10
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 = _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 = _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) =>
      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) =>
      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;
}
