package model

import (
	"encoding/json"
	"fmt"
	"time"
)

// ClientStatus structure
type ClientStatus struct {
	PublicKey             string        `json:"publicKey"`
	HasPresharedKey       bool          `json:"hasPresharedKey"`
	ProtocolVersion       int           `json:"protocolVersion"`
	Name                  string        `json:"name"`
	Email                 string        `json:"email"`
	Connected             bool          `json:"connected"`
	AllowedIPs            []string      `json:"allowedIPs"`
	Endpoint              string        `json:"endpoint"`
	LastHandshake         time.Time     `json:"lastHandshake"`
	LastHandshakeRelative time.Duration `json:"lastHandshakeRelative"`
	ReceivedBytes         int           `json:"receivedBytes"`
	TransmittedBytes      int           `json:"transmittedBytes"`
}

// MarshalJSON structure to json
func (c *ClientStatus) MarshalJSON() ([]byte, error) {

	duration := fmt.Sprintf("%v ago", c.LastHandshakeRelative)
	if c.LastHandshakeRelative.Hours() > 5208 { // 24*7*31 = approx one month
		duration = "more than a month ago"
	}
	return json.Marshal(&struct {
		PublicKey             string    `json:"publicKey"`
		HasPresharedKey       bool      `json:"hasPresharedKey"`
		ProtocolVersion       int       `json:"protocolVersion"`
		Name                  string    `json:"name"`
		Email                 string    `json:"email"`
		Connected             bool      `json:"connected"`
		AllowedIPs            []string  `json:"allowedIPs"`
		Endpoint              string    `json:"endpoint"`
		LastHandshake         time.Time `json:"lastHandshake"`
		LastHandshakeRelative string    `json:"lastHandshakeRelative"`
		ReceivedBytes         int       `json:"receivedBytes"`
		TransmittedBytes      int       `json:"transmittedBytes"`
	}{
		PublicKey:             c.PublicKey,
		HasPresharedKey:       c.HasPresharedKey,
		ProtocolVersion:       c.ProtocolVersion,
		Name:                  c.Name,
		Email:                 c.Email,
		Connected:             c.Connected,
		AllowedIPs:            c.AllowedIPs,
		Endpoint:              c.Endpoint,
		LastHandshake:         c.LastHandshake,
		LastHandshakeRelative: duration,
		ReceivedBytes:         c.ReceivedBytes,
		TransmittedBytes:      c.TransmittedBytes,
	})
}

// InterfaceStatus structure
type InterfaceStatus struct {
	Name          string `json:"name"`
	DeviceType    string `json:"type"`
	ListenPort    int    `json:"listenPort"`
	NumberOfPeers int    `json:"numPeers"`
	PublicKey     string `json:"publicKey"`
}