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

package webrtc

import (
	
)

// RTCPMuxPolicy affects what ICE candidates are gathered to support
// non-multiplexed RTCP.
type RTCPMuxPolicy int

const (
	// RTCPMuxPolicyUnknown is the enum's zero-value.
	RTCPMuxPolicyUnknown RTCPMuxPolicy = iota

	// RTCPMuxPolicyNegotiate indicates to gather ICE candidates for both
	// RTP and RTCP candidates. If the remote-endpoint is capable of
	// multiplexing RTCP, multiplex RTCP on the RTP candidates. If it is not,
	// use both the RTP and RTCP candidates separately.
	RTCPMuxPolicyNegotiate

	// RTCPMuxPolicyRequire indicates to gather ICE candidates only for
	// RTP and multiplex RTCP on the RTP candidates. If the remote endpoint is
	// not capable of rtcp-mux, session negotiation will fail.
	RTCPMuxPolicyRequire
)

// This is done this way because of a linter.
const (
	rtcpMuxPolicyNegotiateStr = "negotiate"
	rtcpMuxPolicyRequireStr   = "require"
)

func newRTCPMuxPolicy( string) RTCPMuxPolicy {
	switch  {
	case rtcpMuxPolicyNegotiateStr:
		return RTCPMuxPolicyNegotiate
	case rtcpMuxPolicyRequireStr:
		return RTCPMuxPolicyRequire
	default:
		return RTCPMuxPolicyUnknown
	}
}

func ( RTCPMuxPolicy) () string {
	switch  {
	case RTCPMuxPolicyNegotiate:
		return rtcpMuxPolicyNegotiateStr
	case RTCPMuxPolicyRequire:
		return rtcpMuxPolicyRequireStr
	default:
		return ErrUnknownType.Error()
	}
}

// UnmarshalJSON parses the JSON-encoded data and stores the result.
func ( *RTCPMuxPolicy) ( []byte) error {
	var  string
	if  := json.Unmarshal(, &);  != nil {
		return 
	}

	* = newRTCPMuxPolicy()

	return nil
}

// MarshalJSON returns the JSON encoding.
func ( RTCPMuxPolicy) () ([]byte, error) {
	return json.Marshal(.String())
}