// 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_file_system_entity.dart';

/// [File] implementation that replays all invocation activity from a prior
/// recording.
class ReplayFile extends ReplayFileSystemEntity implements File {
  /// Creates a new `ReplayFile`.
  ReplayFile(ReplayFileSystemImpl fileSystem, String identifier)
      : super(fileSystem, identifier) {
    Converter<String, File> reviveFile = new ReviveFile(fileSystem);
    Converter<String, Future<File>> reviveFileAsFuture =
        reviveFile.fuse(const ToFuture<File>());
    Converter<String, List<int>> blobToBytes = new BlobToBytes(fileSystem);
    Converter<String, String> blobToString = blobToBytes.fuse(UTF8.decoder);
    Converter<String, RandomAccessFile> reviveRandomAccessFile =
        new ReviveRandomAccessFile(fileSystem);
    Converter<String, List<String>> lineSplitter =
        const LineSplitterConverter();
    Converter<String, List<String>> blobToLines =
        blobToString.fuse(lineSplitter);
    Converter<String, Stream<List<int>>> blobToByteStream = blobToBytes
        .fuse(const Listify<List<int>>())
        .fuse(const ToStream<List<int>>());

    methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
      #rename: reviveFileAsFuture,
      #renameSync: reviveFile,
      #delete: reviveFileAsFuture,
      #create: reviveFileAsFuture,
      #createSync: const Passthrough<Null>(),
      #copy: reviveFileAsFuture,
      #copySync: reviveFile,
      #length: const ToFuture<int>(),
      #lengthSync: const Passthrough<int>(),
      #lastAccessed: DateTimeCodec.deserialize.fuse(const ToFuture<DateTime>()),
      #lastAccessedSync: DateTimeCodec.deserialize,
      #setLastAccessed: const ToFuture<dynamic>(),
      #setLastAccessedSync: const Passthrough<Null>(),
      #lastModified: DateTimeCodec.deserialize.fuse(const ToFuture<DateTime>()),
      #lastModifiedSync: DateTimeCodec.deserialize,
      #setLastModified: const ToFuture<dynamic>(),
      #setLastModifiedSync: const Passthrough<Null>(),
      #open: reviveRandomAccessFile.fuse(const ToFuture<RandomAccessFile>()),
      #openSync: reviveRandomAccessFile,
      #openRead: blobToByteStream,
      #openWrite: new ReviveIOSink(fileSystem),
      #readAsBytes: blobToBytes.fuse(const ToFuture<List<int>>()),
      #readAsBytesSync: blobToBytes,
      #readAsString: blobToString.fuse(const ToFuture<String>()),
      #readAsStringSync: blobToString,
      #readAsLines: blobToLines.fuse(const ToFuture<List<String>>()),
      #readAsLinesSync: blobToLines,
      #writeAsBytes: reviveFileAsFuture,
      #writeAsBytesSync: const Passthrough<Null>(),
      #writeAsString: reviveFileAsFuture,
      #writeAsStringSync: const Passthrough<Null>(),
    });

    properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
      #absolute: reviveFile,
    });
  }
}
