package comms

import (
	"encoding/gob"
	"os"
	"os/user"
	"runtime"
	"time"
)

const PROTOCOL_VERSION = 1

func init() {
	RegisterEventsWithGob()
}

// Client to server events

type AgentInfo struct {
	Username string
	Hostname string
	Pwd      string
	OS       string
}

type ClientInfo struct {
	ClientId int
}

type SessionInfo struct {
	// "ssh", "sftp"
	SessionType string
}

type ExpiryTimeUpdate struct {
	ExpiryTime time.Time
}

type HeartBeat struct {
	// Empty
}

// Message sent from converge server to agent

type ProtocolVersion struct {
	Version int
}

type UserPassword struct {
	Username string
	Password string
}

type ServerInfo struct {
	UserPassword UserPassword
}

// Generic wrapper message required to send messages of arbitrary type

type ConvergeMessage struct {
	Value interface{}
}

func NewAgentInfo() AgentInfo {
	username, _ := user.Current()
	host, _ := os.Hostname()
	pwd, _ := os.Getwd()
	return AgentInfo{
		Username: username.Username,
		Hostname: host,
		Pwd:      pwd,
		OS:       runtime.GOOS,
	}
}

func NewSessionInfo(sessionType string) SessionInfo {
	return SessionInfo{SessionType: sessionType}
}

func NewExpiryTimeUpdate(expiryTime time.Time) ExpiryTimeUpdate {
	return ExpiryTimeUpdate{ExpiryTime: expiryTime}
}

func RegisterEventsWithGob() {
	// Agent to ConvergeServer
	gob.Register(AgentInfo{})
	gob.Register(SessionInfo{})
	gob.Register(ExpiryTimeUpdate{})
	gob.Register(HeartBeat{})

	// ConvergeServer to Agent
	gob.Register(ProtocolVersion{})
	gob.Register(UserPassword{})

	// Wrapper event.
	gob.Register(ConvergeMessage{})
}