package utils

import (
	"net"
	"net/url"
)

// IsIntranetURL 判断监控地址的主机是否为内网 / 本机 IP（直填 IP 的虚拟局域网站点）。
// 仅识别主机名为 IPv4/IPv6 字面量的情况；公网域名不在此列。
func IsIntranetURL(raw string) bool {
	u, err := url.Parse(raw)
	if err != nil {
		return false
	}
	host := u.Hostname()
	if host == "" {
		return false
	}
	ip := net.ParseIP(host)
	if ip == nil {
		return false
	}
	return isIntranetIP(ip)
}

func isIntranetIP(ip net.IP) bool {
	if ip.IsLoopback() || ip.IsPrivate() || ip.IsLinkLocalUnicast() {
		return true
	}
	// Go 1.17+ IsPrivate 已含 RFC1918、CGNAT 100.64/10、ULA 等；再兜底部分实现差异
	if v4 := ip.To4(); v4 != nil {
		if v4[0] == 100 && v4[1] >= 64 && v4[1] <= 127 {
			return true
		}
	}
	return false
}
