package quic

import (
	

	
	
)

type cryptoStreamManager struct {
	initialStream   *initialCryptoStream
	handshakeStream *cryptoStream
	oneRTTStream    *cryptoStream
}

func newCryptoStreamManager(
	 *initialCryptoStream,
	 *cryptoStream,
	 *cryptoStream,
) *cryptoStreamManager {
	return &cryptoStreamManager{
		initialStream:   ,
		handshakeStream: ,
		oneRTTStream:    ,
	}
}

func ( *cryptoStreamManager) ( *wire.CryptoFrame,  protocol.EncryptionLevel) error {
	//nolint:exhaustive // CRYPTO frames cannot be sent in 0-RTT packets.
	switch  {
	case protocol.EncryptionInitial:
		return .initialStream.HandleCryptoFrame()
	case protocol.EncryptionHandshake:
		return .handshakeStream.HandleCryptoFrame()
	case protocol.Encryption1RTT:
		return .oneRTTStream.HandleCryptoFrame()
	default:
		return fmt.Errorf("received CRYPTO frame with unexpected encryption level: %s", )
	}
}

func ( *cryptoStreamManager) ( protocol.EncryptionLevel) []byte {
	//nolint:exhaustive // CRYPTO frames cannot be sent in 0-RTT packets.
	switch  {
	case protocol.EncryptionInitial:
		return .initialStream.GetCryptoData()
	case protocol.EncryptionHandshake:
		return .handshakeStream.GetCryptoData()
	case protocol.Encryption1RTT:
		return .oneRTTStream.GetCryptoData()
	default:
		panic(fmt.Sprintf("received CRYPTO frame with unexpected encryption level: %s", ))
	}
}

func ( *cryptoStreamManager) ( protocol.ByteCount) *wire.CryptoFrame {
	if !.oneRTTStream.HasData() {
		return nil
	}
	return .oneRTTStream.PopCryptoFrame()
}

func ( *cryptoStreamManager) ( protocol.EncryptionLevel) error {
	//nolint:exhaustive // 1-RTT keys should never get dropped.
	switch  {
	case protocol.EncryptionInitial:
		return .initialStream.Finish()
	case protocol.EncryptionHandshake:
		return .handshakeStream.Finish()
	default:
		panic(fmt.Sprintf("dropped unexpected encryption level: %s", ))
	}
}