package yu_proxy

import (
	yu_strconv "gogs.qqck.cn/s/tools/strconv"
	"time"
)

// Info 单个代理信息
type Info struct {
	// Host 代理地址，IP 或 域名
	Host string `json:"addr"`

	// Port 端口号
	Port int

	// User 认证账号密码
	User string `json:"user"`

	// Pass 认证密码
	Pass string `json:"pass"`

	// Type 0：http/https，1：socks5
	Type byte `json:"type"`

	// Timeout 过期时间，单位：秒，-1 为永不过期
	Timeout int64 `json:"timeout"`

	Domain bool // 是否由代理解析域名
}

func NewInfo() (t *Info) {
	t = &Info{}
	t.SetHttp()
	t.SetTimeout(-1)
	t.SetDomain(true)
	return
}

// SetHost
//
//	@Description: 设置代理地址，IP 或 域名
func (t *Info) SetHost(value string) *Info {
	if t == nil {
		return t
	}
	t.Host = value
	return t
}

// SetPort
//
//	@Description: 设置代理 端口号
func (t *Info) SetPort(value int) *Info {
	if t == nil {
		return t
	}
	t.Port = value
	return t
}

// SetAuthorization
//
//	@Description: 设置认证信息，默认：无需认证
func (t *Info) SetAuthorization(user string, pass string) *Info {
	if t == nil {
		return t
	}
	t.User, t.Pass = user, pass
	return t
}

// IsAuthorization
//
//	@Description: 代理是否需要授权
func (t *Info) IsAuthorization() bool {
	if t == nil {
		return false
	}
	return t.User != "" && t.Pass != ""
}

// SetHttp
//
//	@Description: 设置为 http 代理，默认：http
func (t *Info) SetHttp() *Info {
	if t == nil {
		return t
	}
	t.Type = 0
	return t
}

// IsHttp
//
//	@Description: 判断是否为 http 代理
func (t *Info) IsHttp() bool {
	if t == nil {
		return false
	}
	return t.Type == 0
}

// SetSocks5
//
//	@Description: 设置为 socks5 代理
func (t *Info) SetSocks5() *Info {
	if t == nil {
		return t
	}
	t.Type = 1
	return t
}

// IsSocks5
//
//	@Description: 判断是否为 socks5 代理
func (t *Info) IsSocks5() bool {
	if t == nil {
		return false
	}
	return t.Type == 1
}

// SetTimeout
//
//	@Description: 设置代理有效截止时间，-1 为永不过期，单位：秒，默认：-1
func (t *Info) SetTimeout(timeout int64) *Info {
	if t == nil {
		return t
	}
	t.Timeout = timeout
	return t
}

// SetDomain
//
//	@Description: 设置是否由代理解析域名，默认：true
func (t *Info) SetDomain(value bool) *Info {
	if t == nil {
		return t
	}
	t.Domain = value
	return t
}

// IsTimeout
//
//	@Description: 判断代理是否过期
func (t *Info) IsTimeout() bool {
	if t == nil {
		return true
	}
	return t.Timeout != -1 && time.Now().Unix() > t.Timeout
}

// IsValid
//
//	@Description: 代理信息是否有效，如需判断代理信息是否过期请调用 IsTimeout()
func (t *Info) IsValid() bool {
	if t == nil {
		return false
	}
	return t.Host != "" && t.Port != 0
}

// Copy
//
//	@Description: Copy一个新指针
func (t *Info) Copy() (info *Info) {
	if t == nil {
		return t
	}
	info = &Info{t.Host, t.Port, t.User, t.Pass, t.Type, t.Timeout, t.Domain}
	return
}

// Encode
//
//	@Description: 编码为"ProxyType://user:pass@host:port"，例如："http://user:pass@127.0.0.1:808"、"socks5://user:pass@127.0.0.1:808"
func (t *Info) Encode() string {
	if t == nil {
		return "http://0.0.0.0:65535"
	}
	j_buf := make([]byte, 0, 64)
	if t.IsHttp() {
		j_buf = append(j_buf, "http://"...)
	} else if t.IsSocks5() {
		j_buf = append(j_buf, "socks5://"...)
	}
	if t.User != "" && t.Pass != "" {
		j_buf = append(j_buf, t.User...)
		j_buf = append(j_buf, ':')
		j_buf = append(j_buf, t.Pass...)
		j_buf = append(j_buf, '@')
	}
	j_buf = append(j_buf, t.Host...)
	j_buf = append(j_buf, ':')
	j_buf = append(j_buf, yu_strconv.FormatInt(t.Port)...)
	return string(j_buf)
}
