package qlog

import (
	

	
	
)

type Token struct {
	Raw []byte
}

func ( Token) ( *jsontext.Encoder) error {
	 := encoderHelper{enc: }
	.WriteToken(jsontext.BeginObject)
	.WriteToken(jsontext.String("data"))
	.WriteToken(jsontext.String(hex.EncodeToString(.Raw)))
	.WriteToken(jsontext.EndObject)
	return .err
}

// PacketHeader is a QUIC packet header.
type PacketHeader struct {
	PacketType       PacketType
	KeyPhaseBit      KeyPhaseBit
	PacketNumber     PacketNumber
	Version          Version
	SrcConnectionID  ConnectionID
	DestConnectionID ConnectionID
	Token            *Token
}

func ( PacketHeader) ( *jsontext.Encoder) error {
	 := encoderHelper{enc: }
	.WriteToken(jsontext.BeginObject)
	.WriteToken(jsontext.String("packet_type"))
	.WriteToken(jsontext.String(string(.PacketType)))
	if .PacketType != PacketTypeRetry && .PacketType != PacketTypeVersionNegotiation && .PacketType != "" &&
		.PacketNumber != protocol.InvalidPacketNumber {
		.WriteToken(jsontext.String("packet_number"))
		.WriteToken(jsontext.Int(int64(.PacketNumber)))
	}
	if .Version != 0 {
		.WriteToken(jsontext.String("version"))
		.WriteToken(jsontext.String(version(.Version).String()))
	}
	if .PacketType != PacketType1RTT {
		.WriteToken(jsontext.String("scil"))
		.WriteToken(jsontext.Int(int64(.SrcConnectionID.Len())))
		if .SrcConnectionID.Len() > 0 {
			.WriteToken(jsontext.String("scid"))
			.WriteToken(jsontext.String(.SrcConnectionID.String()))
		}
	}
	.WriteToken(jsontext.String("dcil"))
	.WriteToken(jsontext.Int(int64(.DestConnectionID.Len())))
	if .DestConnectionID.Len() > 0 {
		.WriteToken(jsontext.String("dcid"))
		.WriteToken(jsontext.String(.DestConnectionID.String()))
	}
	if .KeyPhaseBit == KeyPhaseZero || .KeyPhaseBit == KeyPhaseOne {
		.WriteToken(jsontext.String("key_phase_bit"))
		.WriteToken(jsontext.String(.KeyPhaseBit.String()))
	}
	if .Token != nil {
		.WriteToken(jsontext.String("token"))
		if  := .Token.encode();  != nil {
			return 
		}
	}
	.WriteToken(jsontext.EndObject)
	return .err
}

type PacketHeaderVersionNegotiation struct {
	SrcConnectionID  ArbitraryLenConnectionID
	DestConnectionID ArbitraryLenConnectionID
}

func ( PacketHeaderVersionNegotiation) ( *jsontext.Encoder) error {
	 := encoderHelper{enc: }
	.WriteToken(jsontext.BeginObject)
	.WriteToken(jsontext.String("packet_type"))
	.WriteToken(jsontext.String("version_negotiation"))
	.WriteToken(jsontext.String("scil"))
	.WriteToken(jsontext.Int(int64(.SrcConnectionID.Len())))
	.WriteToken(jsontext.String("scid"))
	.WriteToken(jsontext.String(.SrcConnectionID.String()))
	.WriteToken(jsontext.String("dcil"))
	.WriteToken(jsontext.Int(int64(.DestConnectionID.Len())))
	.WriteToken(jsontext.String("dcid"))
	.WriteToken(jsontext.String(.DestConnectionID.String()))
	.WriteToken(jsontext.EndObject)
	return .err
}