// 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';

/// [IOSink] implementation that replays all invocation activity from a prior
/// recording.
class ReplayIOSink extends ReplayProxyMixin implements IOSink {
  final ReplayFileSystemImpl _fileSystem;

  /// Creates a new [ReplayIOSink].
  ReplayIOSink(this._fileSystem, this.identifier) {
    methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
      #add: const Passthrough<Null>(),
      #write: const Passthrough<Null>(),
      #writeAll: const Passthrough<Null>(),
      #writeln: const Passthrough<Null>(),
      #writeCharCode: const Passthrough<Null>(),
      #addError: const Passthrough<Null>(),
      #addStream: const ToFuture<dynamic>(),
      #flush: const ToFuture<dynamic>(),
      #close: const ToFuture<dynamic>(),
    });

    properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
      #encoding: EncodingCodec.deserialize,
      const Symbol('encoding='): const Passthrough<Null>(),
      #done: const Passthrough<dynamic>().fuse(const ToFuture<dynamic>()),
    });
  }

  @override
  final String identifier;

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

  @override
  dynamic onResult(Invocation invocation, dynamic result) {
    if (invocation.memberName == #addStream) {
      Stream<List<int>> stream = invocation.positionalArguments.first;
      Future<dynamic> future = result;
      return future.then((_) => stream.drain());
    }
    return result;
  }
}
