package scenarios

import (
	v2net "v2ray.com/core/common/net"
)

const (
	socks5Version = byte(0x05)
)

func socks5AuthMethodRequest(methods ...byte) []byte {
	request := []byte{socks5Version, byte(len(methods))}
	request = append(request, methods...)
	return request
}

func appendAddress(request []byte, address v2net.Address) []byte {
	switch address.Family() {
	case v2net.AddressFamilyIPv4:
		request = append(request, byte(0x01))
		request = append(request, address.IP()...)

	case v2net.AddressFamilyIPv6:
		request = append(request, byte(0x04))
		request = append(request, address.IP()...)

	case v2net.AddressFamilyDomain:
		request = append(request, byte(0x03), byte(len(address.Domain())))
		request = append(request, []byte(address.Domain())...)

	}
	return request
}

func socks5Request(command byte, address v2net.Destination) []byte {
	request := []byte{socks5Version, command, 0}
	request = appendAddress(request, address.Address)
	request = address.Port.Bytes(request)
	return request
}

func socks5UDPRequest(address v2net.Destination, payload []byte) []byte {
	request := make([]byte, 0, 1024)
	request = append(request, 0, 0, 0)
	request = appendAddress(request, address.Address)
	request = address.Port.Bytes(request)
	request = append(request, payload...)
	return request
}
