package wire

import (
	
	
	

	
	
)

// A NewConnectionIDFrame is a NEW_CONNECTION_ID frame
type NewConnectionIDFrame struct {
	SequenceNumber      uint64
	RetirePriorTo       uint64
	ConnectionID        protocol.ConnectionID
	StatelessResetToken protocol.StatelessResetToken
}

func parseNewConnectionIDFrame( []byte,  protocol.Version) (*NewConnectionIDFrame, int, error) {
	 := len()
	, ,  := quicvarint.Parse()
	if  != nil {
		return nil, 0, replaceUnexpectedEOF()
	}
	 = [:]
	, ,  := quicvarint.Parse()
	if  != nil {
		return nil, 0, replaceUnexpectedEOF()
	}
	 = [:]
	if  >  {
		//nolint:staticcheck // SA1021: Retire Prior To is the name of the field
		return nil, 0, fmt.Errorf("Retire Prior To value (%d) larger than Sequence Number (%d)", , )
	}
	if len() == 0 {
		return nil, 0, io.EOF
	}
	 := int([0])
	 = [1:]
	if  == 0 {
		return nil, 0, errors.New("invalid zero-length connection ID")
	}
	if  > protocol.MaxConnIDLen {
		return nil, 0, protocol.ErrInvalidConnectionIDLen
	}
	if len() <  {
		return nil, 0, io.EOF
	}
	 := &NewConnectionIDFrame{
		SequenceNumber: ,
		RetirePriorTo:  ,
		ConnectionID:   protocol.ParseConnectionID([:]),
	}
	 = [:]
	if len() < len(.StatelessResetToken) {
		return nil, 0, io.EOF
	}
	copy(.StatelessResetToken[:], )
	return ,  - len() + len(.StatelessResetToken), nil
}

func ( *NewConnectionIDFrame) ( []byte,  protocol.Version) ([]byte, error) {
	 = append(, byte(FrameTypeNewConnectionID))
	 = quicvarint.Append(, .SequenceNumber)
	 = quicvarint.Append(, .RetirePriorTo)
	 := .ConnectionID.Len()
	if  > protocol.MaxConnIDLen {
		return nil, fmt.Errorf("invalid connection ID length: %d", )
	}
	 = append(, uint8())
	 = append(, .ConnectionID.Bytes()...)
	 = append(, .StatelessResetToken[:]...)
	return , nil
}

// Length of a written frame
func ( *NewConnectionIDFrame) (protocol.Version) protocol.ByteCount {
	return 1 + protocol.ByteCount(quicvarint.Len(.SequenceNumber)+quicvarint.Len(.RetirePriorTo)+1 /* connection ID length */ +.ConnectionID.Len()) + 16
}