/** @file
 *
 *  A brief file description
 *
 *  @section license License
 *
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#pragma once

#include "QUICTypes.h"
#include "QUICBidirectionalStream.h"
#include "QUICUnidirectionalStream.h"
#include "QUICApplicationMap.h"
#include "QUICFrameHandler.h"
#include "QUICFrame.h"
#include "QUICStreamFactory.h"
#include "QUICLossDetector.h"

class QUICTransportParameters;

class QUICStreamManager : public QUICFrameHandler, public QUICFrameGenerator
{
public:
  QUICStreamManager(QUICConnectionInfoProvider *info, QUICRTTProvider *rtt_provider, QUICApplicationMap *app_map);

  void init_flow_control_params(const std::shared_ptr<const QUICTransportParameters> &local_tp,
                                const std::shared_ptr<const QUICTransportParameters> &remote_tp);
  void set_max_streams_bidi(uint64_t max_streams);
  void set_max_streams_uni(uint64_t max_streams);
  uint64_t total_reordered_bytes() const;
  uint64_t total_offset_received() const;
  uint64_t total_offset_sent() const;

  uint32_t stream_count() const;
  QUICConnectionErrorUPtr create_stream(QUICStreamId stream_id);
  QUICConnectionErrorUPtr create_uni_stream(QUICStreamId &new_stream_id);
  QUICConnectionErrorUPtr create_bidi_stream(QUICStreamId &new_stream_id);
  void reset_stream(QUICStreamId stream_id, QUICStreamErrorUPtr error);

  void set_default_application(QUICApplication *app);

  DLL<QUICStreamVConnection> stream_list;

  // QUICFrameHandler
  virtual std::vector<QUICFrameType> interests() override;
  virtual QUICConnectionErrorUPtr handle_frame(QUICEncryptionLevel level, const QUICFrame &frame) override;

  // QUICFrameGenerator
  bool will_generate_frame(QUICEncryptionLevel level, size_t current_packet_size, bool ack_eliciting, uint32_t timestamp) override;
  QUICFrame *generate_frame(uint8_t *buf, QUICEncryptionLevel level, uint64_t connection_credit, uint16_t maximum_frame_size,
                            size_t current_packet_size, uint32_t timestamp) override;

protected:
  virtual bool _is_level_matched(QUICEncryptionLevel level) override;

private:
  QUICStreamVConnection *_find_stream_vc(QUICStreamId id);
  QUICStreamVConnection *_find_or_create_stream_vc(QUICStreamId stream_id);
  void _add_total_offset_sent(uint32_t sent_byte);
  QUICConnectionErrorUPtr _handle_frame(const QUICStreamFrame &frame);
  QUICConnectionErrorUPtr _handle_frame(const QUICRstStreamFrame &frame);
  QUICConnectionErrorUPtr _handle_frame(const QUICStopSendingFrame &frame);
  QUICConnectionErrorUPtr _handle_frame(const QUICMaxStreamDataFrame &frame);
  QUICConnectionErrorUPtr _handle_frame(const QUICStreamDataBlockedFrame &frame);
  QUICConnectionErrorUPtr _handle_frame(const QUICMaxStreamsFrame &frame);

  QUICStreamFactory _stream_factory;

  QUICConnectionInfoProvider *_info                           = nullptr;
  QUICApplicationMap *_app_map                                = nullptr;
  std::shared_ptr<const QUICTransportParameters> _local_tp    = nullptr;
  std::shared_ptr<const QUICTransportParameters> _remote_tp   = nullptr;
  QUICStreamId _local_max_streams_bidi                        = 0;
  QUICStreamId _local_max_streams_uni                         = 0;
  QUICStreamId _remote_max_streams_bidi                       = 0;
  QUICStreamId _remote_max_streams_uni                        = 0;
  QUICStreamId _next_stream_id_uni                            = 0;
  QUICStreamId _next_stream_id_bidi                           = 0;
  uint64_t _total_offset_sent                                 = 0;
  std::array<QUICEncryptionLevel, 2> _encryption_level_filter = {
    QUICEncryptionLevel::ZERO_RTT,
    QUICEncryptionLevel::ONE_RTT,
  };
};
