package webrtc

import (
	"github.com/pion/webrtc/v4"
)

// BuildICEConfig translates a Config into the two Pion config pieces every
// PeerConnection needs: a webrtc.Configuration (with ICE servers) and a
// SettingEngine (with NAT1To1 and port range tuning).
//
// The returned *SettingEngine may be nil if no engine-level tuning is
// required (i.e. PublicIP unset and UDPPortRange at defaults). Callers
// should only pass it to webrtc.NewAPI when non-nil.
func BuildICEConfig(c Config) (webrtc.Configuration, *webrtc.SettingEngine, error) {
	if err := c.Validate(); err != nil {
		return webrtc.Configuration{}, nil, err
	}

	rtcConfig := webrtc.Configuration{
		ICEServers: make([]webrtc.ICEServer, 0, len(c.ICEServers)),
	}
	for _, uri := range c.ICEServers {
		rtcConfig.ICEServers = append(rtcConfig.ICEServers, webrtc.ICEServer{
			URLs: []string{uri},
		})
	}

	var se *webrtc.SettingEngine
	if c.PublicIP != "" || c.UDPPortRange.Low > 0 {
		engine := webrtc.SettingEngine{}
		if c.PublicIP != "" {
			engine.SetNAT1To1IPs([]string{c.PublicIP}, webrtc.ICECandidateTypeHost)
		}
		// Constrain the ephemeral UDP range Pion allocates for ICE candidates.
		// Note: this is a separate concern from our FFmpeg→Source UDP ports;
		// Pion uses its own port pool for the WebRTC media path.
		if c.UDPPortRange.Low > 0 && c.UDPPortRange.High >= c.UDPPortRange.Low {
			if err := engine.SetEphemeralUDPPortRange(
				uint16(c.UDPPortRange.Low), uint16(c.UDPPortRange.High)); err != nil {
				return webrtc.Configuration{}, nil, err
			}
		}
		se = &engine
	}

	return rtcConfig, se, nil
}
