// Package recent tracks the last 20 incoming JSON request.
package recent

import (
	"sync"
	"time"
)

const (
	// MAX_RECENT is the largest number of recent requests that will be displayed.
	MAX_RECENT = 20
)

// Request is a record of a single POST request.
type Request struct {
	TS   string
	JSON string
}

// Recent tracks the last MAX_RECENT Requests.
type Recent struct {
	// mutex guards access to recent.
	mutex sync.Mutex

	// recent is just the last MAX_RECENT requests.
	recent []*Request
}

func New() *Recent {
	return &Recent{
		recent: []*Request{},
	}
}

// Add the JSON body that was POST'd to the server.
func (r *Recent) Add(b []byte) {
	// Store locally.
	r.mutex.Lock()
	defer r.mutex.Unlock()

	r.recent = append([]*Request{{
		TS:   time.Now().UTC().String(),
		JSON: string(b),
	}}, r.recent...)

	// Keep track of the last N events.
	if len(r.recent) > MAX_RECENT {
		r.recent = r.recent[:MAX_RECENT]
	}
}

// List returns the last MAX_RECENT Requests, with the most recent
// Requests first.
func (r *Recent) List() []*Request {
	r.mutex.Lock()
	defer r.mutex.Unlock()
	ret := make([]*Request, len(r.recent), len(r.recent))
	for i, req := range r.recent {
		ret[i] = req
	}
	return ret
}
