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

import 'dart:async';
import 'dart:convert';

import 'package:file/file.dart';

import 'codecs.dart';
import 'replay_file_system.dart';
import 'replay_proxy_mixin.dart';

/// [FileSystemEntity] implementation that replays all invocation activity
/// from a prior recording.
abstract class ReplayFileSystemEntity extends Object
    with ReplayProxyMixin
    implements FileSystemEntity {
  /// Creates a new `ReplayFileSystemEntity`.
  ReplayFileSystemEntity(this.fileSystem, this.identifier) {
    Converter<List<Map<String, Object>>, List<FileSystemEvent>> toEvents =
        const ConvertElements<Map<String, Object>, FileSystemEvent>(
            FileSystemEventCodec.deserialize);
    Converter<List<Map<String, Object>>, Stream<FileSystemEvent>>
        toEventStream = toEvents.fuse(const ToStream<FileSystemEvent>());

    methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
      #exists: const ToFuture<bool>(),
      #existsSync: const Passthrough<bool>(),
      #resolveSymbolicLinks: const ToFuture<String>(),
      #resolveSymbolicLinksSync: const Passthrough<String>(),
      #stat: FileStatCodec.deserialize.fuse(const ToFuture<FileStat>()),
      #statSync: FileStatCodec.deserialize,
      #deleteSync: const Passthrough<Null>(),
      #watch: toEventStream,
    });

    properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
      #path: const Passthrough<String>(),
      #uri: UriCodec.deserialize,
      #isAbsolute: const Passthrough<bool>(),
      #parent: new ReviveDirectory(fileSystem),
      #basename: const Passthrough<String>(),
      #dirname: const Passthrough<String>(),
    });
  }

  @override
  final ReplayFileSystemImpl fileSystem;

  @override
  final String identifier;

  @override
  List<Map<String, dynamic>> get manifest => fileSystem.manifest;
}
