// Copyright (c) 2015, 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 '../../transport.dart';

/// The subclasses of [Message] are objects that are coming from the
/// connection layer on top of frames.
///
/// Messages on a HTTP/2 stream will be represented by a different class
/// hierarchy.
abstract class Message {
  final int streamId;
  final bool endStream;

  Message(this.streamId, this.endStream);
}

class HeadersMessage extends Message {
  final List<Header> headers;

  HeadersMessage(int streamId, this.headers, bool endStream)
      : super(streamId, endStream);

  @override
  String toString() =>
      'HeadersMessage(headers: ${headers.length}, endStream: $endStream)';
}

class DataMessage extends Message {
  final List<int> bytes;

  DataMessage(int streamId, this.bytes, bool endStream)
      : super(streamId, endStream);

  @override
  String toString() =>
      'DataMessage(bytes: ${bytes.length}, endStream: $endStream)';
}

class PushPromiseMessage extends Message {
  final List<Header> headers;
  final int promisedStreamId;
  final ClientTransportStream pushedStream;

  PushPromiseMessage(int streamId, this.headers, this.promisedStreamId,
      this.pushedStream, bool endStream)
      : super(streamId, endStream);

  @override
  String toString() => 'PushPromiseMessage(bytes: ${headers.length}, '
      'promisedStreamId: $promisedStreamId, endStream: $endStream)';
}

class ResetStreamMessage extends Message {
  final int errorCode;

  ResetStreamMessage(int streamId, this.errorCode) : super(streamId, false);

  @override
  String toString() => 'ResetStreamMessage(errorCode: $errorCode)';
}

class GoawayMessage extends Message {
  final int lastStreamId;
  final int errorCode;
  final List<int> debugData;

  GoawayMessage(this.lastStreamId, this.errorCode, this.debugData)
      : super(0, false);

  @override
  String toString() => 'GoawayMessage(lastStreamId: $lastStreamId, '
      'errorCode: $errorCode, debugData: ${debugData.length})';
}
