package gupta

import (
	"bytes"
	"fmt"
	"io"
	"strconv"
	"strings"
)

type Memory struct {
	Total uint64 `json:"total"`
	Free  uint64 `json:"free"`
}

func (m Memory) MarshalJSON() ([]byte, error) {
	jsonData := []byte(
		fmt.Sprintf("{\"memory\": {\"total\": \"%dKB\", \"used\": \"%dKB\", \"free\": \"%dKB\"}}",
			m.Total, m.Used(), m.Free))
	return jsonData, nil
}

func (m *Memory) Used() uint64 {
	return m.Total - m.Free
}

func NewMemory(r io.ReaderAt) Memory {
	m := Memory{}
	buf := make([]byte, 80)
	r.ReadAt(buf, 0)
	idx := bytes.Index(buf, []byte("MemAvailable"))
	line := string(buf[:idx])
	elements := strings.Fields(line)
	m.Total, _ = strconv.ParseUint(elements[1], 10, 64)
	m.Free, _ = strconv.ParseUint(elements[4], 10, 64)
	return m
}