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

package sctp

import (
	
	
)

// https://tools.ietf.org/html/rfc6525#section-3.1
// chunkReconfig represents an SCTP Chunk used to reconfigure streams.
//
//  0                   1                   2                   3
//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Type = 130    |  Chunk Flags  |      Chunk Length             |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// \                                                               \
// /                  Re-configuration Parameter                   /
// \                                                               \
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// \                                                               \
// /             Re-configuration Parameter (optional)             /
// \                                                               \
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

type chunkReconfig struct {
	chunkHeader
	paramA param
	paramB param
}

// Reconfigure chunk errors.
var (
	ErrChunkParseParamTypeFailed        = errors.New("failed to parse param type")
	ErrChunkMarshalParamAReconfigFailed = errors.New("unable to marshal parameter A for reconfig")
	ErrChunkMarshalParamBReconfigFailed = errors.New("unable to marshal parameter B for reconfig")
)

func ( *chunkReconfig) ( []byte) error {
	if  := .chunkHeader.unmarshal();  != nil {
		return 
	}
	,  := parseParamType(.raw)
	if  != nil {
		return fmt.Errorf("%w: %v", ErrChunkParseParamTypeFailed, ) //nolint:errorlint
	}
	,  := buildParam(, .raw)
	if  != nil {
		return 
	}
	.paramA = 

	 := getPadding(.length())
	 := .length() + 
	if len(.raw) >  {
		,  := parseParamType(.raw[:])
		if  != nil {
			return fmt.Errorf("%w: %v", ErrChunkParseParamTypeFailed, ) //nolint:errorlint
		}
		,  := buildParam(, .raw[:])
		if  != nil {
			return 
		}
		.paramB = 
	}

	return nil
}

func ( *chunkReconfig) () ([]byte, error) {
	,  := .paramA.marshal()
	if  != nil {
		return nil, fmt.Errorf("%w: %v", ErrChunkMarshalParamAReconfigFailed, ) //nolint:errorlint
	}
	if .paramB != nil {
		// Pad param A
		 = padByte(, getPadding(len()))

		,  := .paramB.marshal()
		if  != nil {
			return nil, fmt.Errorf("%w: %v", ErrChunkMarshalParamBReconfigFailed, ) //nolint:errorlint
		}

		 = append(, ...)
	}

	.typ = ctReconfig
	.raw = 

	return .chunkHeader.marshal()
}

func ( *chunkReconfig) () ( bool,  error) {
	// nolint:godox
	// TODO: check allowed combinations:
	// https://tools.ietf.org/html/rfc6525#section-3.1
	return true, nil
}

// String makes chunkReconfig printable.
func ( *chunkReconfig) () string {
	 := fmt.Sprintf("Param A:\n %s", .paramA)
	if .paramB != nil {
		 += fmt.Sprintf("Param B:\n %s", .paramB)
	}

	return 
}