package hodu

import "runtime"
import "github.com/prometheus/client_golang/prometheus"

type ServerCollector struct {
	server           *Server
	BuildInfo        *prometheus.Desc
	ServerConns      *prometheus.Desc
	ServerRoutes     *prometheus.Desc
	ServerPeers      *prometheus.Desc
	SshProxySessions *prometheus.Desc
}

// NewServerCollector returns a new ServerCollector with all prometheus.Desc initialized
func NewServerCollector(server *Server) ServerCollector {
	var prefix string

	prefix = server.Name() + "_"
	return ServerCollector{
		server: server,

		BuildInfo: prometheus.NewDesc(
			prefix + "build_info",
			"Build information",
			[]string{
				"goarch",
				"goos",
				"goversion",
			}, nil,
		),

		ServerConns: prometheus.NewDesc(
			prefix + "server_conns",
			"Number of server connections from clients",
			nil, nil,
		),
		ServerRoutes: prometheus.NewDesc(
			prefix + "server_routes",
			"Number of server-side routes",
			nil, nil,
		),
		ServerPeers: prometheus.NewDesc(
			prefix + "server_peers",
			"Number of server-side peers",
			nil, nil,
		),
		SshProxySessions: prometheus.NewDesc(
			prefix + "pxy_ssh_sessions",
			"Number of SSH proxy sessions",
			nil, nil,
		),
	}
}

func (c ServerCollector) Describe(ch chan<- *prometheus.Desc) {
	ch <- c.BuildInfo
	ch <- c.ServerConns
	ch <- c.ServerRoutes
	ch <- c.ServerPeers
	ch <- c.SshProxySessions
}

func (c ServerCollector) Collect(ch chan<- prometheus.Metric) {

	ch <- prometheus.MustNewConstMetric(
		c.BuildInfo,
		prometheus.GaugeValue,
		1,
		runtime.GOARCH,
		runtime.GOOS,
		runtime.Version(),
	)

	ch <- prometheus.MustNewConstMetric(
		c.ServerConns,
		prometheus.GaugeValue,
		float64(c.server.stats.conns.Load()),
	)

	ch <- prometheus.MustNewConstMetric(
		c.ServerRoutes,
		prometheus.GaugeValue,
		float64(c.server.stats.routes.Load()),
	)

	ch <- prometheus.MustNewConstMetric(
		c.ServerPeers,
		prometheus.GaugeValue,
		float64(c.server.stats.peers.Load()),
	)

	ch <- prometheus.MustNewConstMetric(
		c.SshProxySessions,
		prometheus.GaugeValue,
		float64(c.server.stats.ssh_proxy_sessions.Load()),
	)
}