package hddtemp

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

// Disk contains disk data gathered from hddtemp
type Disk struct {
	DeviceName  string
	Model       string
	Temperature int32
	Unit        string
	Status      string
}

type hddtemp struct{}

// New creates hddtemp
func New() *hddtemp {
	return &hddtemp{}
}

// Fetch gathers disks data from hddtemp daemon.
func (h *hddtemp) Fetch(address string) ([]Disk, error) {
	var (
		err    error
		conn   net.Conn
		buffer bytes.Buffer
	)

	if conn, err = net.Dial("tcp", address); err != nil {
		return nil, err
	}

	if _, err = io.Copy(&buffer, conn); err != nil {
		return nil, err
	}

	fields := strings.Split(buffer.String(), "|")

	size := len(fields) / 5
	disks := make([]Disk, 0, size)
	for index := 0; index < size; index++ {
		status := ""
		offset := index * 5
		device := fields[offset+1]
		device = device[strings.LastIndex(device, "/")+1:]

		temperatureField := fields[offset+3]
		temperature, err := strconv.ParseInt(temperatureField, 10, 32)

		if err != nil {
			temperature = 0
			status = temperatureField
		}

		disks = append(disks, Disk{
			DeviceName:  device,
			Model:       fields[offset+2],
			Temperature: int32(temperature),
			Unit:        fields[offset+4],
			Status:      status,
		})
	}

	return disks, nil
}
