package security

import (
	"net"
	"net/url"

	"proxyrotator/internal/model"
)

// ValidateTestURL 校验测试目标 URL，防止 SSRF
func ValidateTestURL(rawURL string) error {
	u, err := url.Parse(rawURL)
	if err != nil {
		return model.ErrInvalidURL
	}

	// 只允许 http/https
	if u.Scheme != "http" && u.Scheme != "https" {
		return model.ErrUnsafeScheme
	}

	// 解析主机名
	host := u.Hostname()
	if host == "" {
		return model.ErrInvalidURL
	}

	// 解析 IP 地址
	ips, err := net.LookupIP(host)
	if err != nil {
		return model.ErrInvalidURL
	}

	// 检查是否为私网 IP
	for _, ip := range ips {
		if IsPrivateIP(ip) {
			return model.ErrPrivateIP
		}
	}

	return nil
}

// IsPrivateIP 判断是否为私网 IP
func IsPrivateIP(ip net.IP) bool {
	if ip == nil {
		return false
	}

	// 回环地址
	if ip.IsLoopback() {
		return true
	}

	// 链路本地地址
	if ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() {
		return true
	}

	// 私有地址
	if ip.IsPrivate() {
		return true
	}

	// 未指定地址
	if ip.IsUnspecified() {
		return true
	}

	return false
}
