package protocol

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

var (
	Socks4Downgrade = errors.New("Downgraded to Socks 4.")
)

type Socks4AuthenticationRequest struct {
	Version byte
	Command byte
	Port    v2net.Port
	IP      [4]byte
}

type Socks4AuthenticationResponse struct {
	result byte
	port   uint16
	ip     []byte
}

func NewSocks4AuthenticationResponse(result byte, port v2net.Port, ip []byte) *Socks4AuthenticationResponse {
	return &Socks4AuthenticationResponse{
		result: result,
		port:   port.Value(),
		ip:     ip,
	}
}

func (r *Socks4AuthenticationResponse) Write(writer io.Writer) {
	writer.Write([]byte{
		byte(0x00), r.result, byte(r.port >> 8), byte(r.port),
		r.ip[0], r.ip[1], r.ip[2], r.ip[3]})
}
