package agentssh

import (
	"github.com/prometheus/client_golang/prometheus"
)

type sshServerMetrics struct {
	failedConnectionsTotal prometheus.Counter
	sftpConnectionsTotal   prometheus.Counter
	sftpServerErrors       prometheus.Counter
	x11HandlerErrors       *prometheus.CounterVec
	sessionsTotal          *prometheus.CounterVec
	sessionErrors          *prometheus.CounterVec
}

func newSSHServerMetrics(registerer prometheus.Registerer) *sshServerMetrics {
	failedConnectionsTotal := prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: "agent", Subsystem: "ssh_server", Name: "failed_connections_total",
	})
	registerer.MustRegister(failedConnectionsTotal)

	sftpConnectionsTotal := prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: "agent", Subsystem: "ssh_server", Name: "sftp_connections_total",
	})
	registerer.MustRegister(sftpConnectionsTotal)

	sftpServerErrors := prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: "agent", Subsystem: "ssh_server", Name: "sftp_server_errors_total",
	})
	registerer.MustRegister(sftpServerErrors)

	x11HandlerErrors := prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "agent",
			Subsystem: "x11_handler",
			Name:      "errors_total",
		},
		[]string{"error_type"},
	)
	registerer.MustRegister(x11HandlerErrors)

	sessionsTotal := prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "agent",
			Subsystem: "sessions",
			Name:      "total",
		},
		[]string{"magic_type", "pty"},
	)
	registerer.MustRegister(sessionsTotal)

	sessionErrors := prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "agent",
			Subsystem: "sessions",
			Name:      "errors_total",
		},
		[]string{"magic_type", "pty", "error_type"},
	)
	registerer.MustRegister(sessionErrors)

	return &sshServerMetrics{
		failedConnectionsTotal: failedConnectionsTotal,
		sftpConnectionsTotal:   sftpConnectionsTotal,
		sftpServerErrors:       sftpServerErrors,
		x11HandlerErrors:       x11HandlerErrors,
		sessionsTotal:          sessionsTotal,
		sessionErrors:          sessionErrors,
	}
}

func magicTypeMetricLabel(magicType string) string {
	switch magicType {
	case MagicSessionTypeVSCode:
	case MagicSessionTypeJetBrains:
	case "":
		magicType = "ssh"
	default:
		magicType = "unknown"
	}
	return magicType
}
