// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT

package recordlayer

import (
	

	
	
)

// Header implements a TLS RecordLayer header
type Header struct {
	ContentType    protocol.ContentType
	ContentLen     uint16
	Version        protocol.Version
	Epoch          uint16
	SequenceNumber uint64 // uint48 in spec
}

// RecordLayer enums
const (
	HeaderSize        = 13
	MaxSequenceNumber = 0x0000FFFFFFFFFFFF
)

// Marshal encodes a TLS RecordLayer Header to binary
func ( *Header) () ([]byte, error) {
	if .SequenceNumber > MaxSequenceNumber {
		return nil, errSequenceNumberOverflow
	}

	 := make([]byte, HeaderSize)
	[0] = byte(.ContentType)
	[1] = .Version.Major
	[2] = .Version.Minor
	binary.BigEndian.PutUint16([3:], .Epoch)
	util.PutBigEndianUint48([5:], .SequenceNumber)
	binary.BigEndian.PutUint16([HeaderSize-2:], .ContentLen)
	return , nil
}

// Unmarshal populates a TLS RecordLayer Header from binary
func ( *Header) ( []byte) error {
	if len() < HeaderSize {
		return errBufferTooSmall
	}
	.ContentType = protocol.ContentType([0])
	.Version.Major = [1]
	.Version.Minor = [2]
	.Epoch = binary.BigEndian.Uint16([3:])

	// SequenceNumber is stored as uint48, make into uint64
	 := make([]byte, 8)
	copy([2:], [5:11])
	.SequenceNumber = binary.BigEndian.Uint64()

	if !.Version.Equal(protocol.Version1_0) && !.Version.Equal(protocol.Version1_2) {
		return errUnsupportedProtocolVersion
	}

	return nil
}