package temper

import (
	"fmt"

	"github.com/google/gousb"
)

func GetTemperature() (float64, error) {
	ctx := gousb.NewContext()
	defer ctx.Close()

	vid, pid := gousb.ID(0x0c45), gousb.ID(0x7401)
	devs, err := ctx.OpenDevices(func(desc *gousb.DeviceDesc) bool {
		return desc.Vendor == vid && desc.Product == pid
	})

	if err != nil {
		return 0, err
	}

	if len(devs) == 0 {
		return 0, fmt.Errorf("no devices found matching VID %s and PID %s", vid, pid)
	}

	devs[0].SetAutoDetach(true)

	for _, d := range devs {
		defer d.Close()
	}

	cfg, err := devs[0].Config(1)
	if err != nil {
		return 0, err
	}
	defer cfg.Close()

	intf, err := cfg.Interface(1, 0)
	if err != nil {
		return 0, err
	}
	defer intf.Close()

	epIn, err := intf.InEndpoint(0x82)
	if err != nil {
		return 0, err
	}

	_, err = devs[0].Control(
		0x21, 0x09, 0x0200, 0x01, []byte{0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00},
	)
	if err != nil {
		return 0, err
	}

	buf := make([]byte, 8)
	if _, err = epIn.Read(buf); err != nil {
		return 0, err
	}

	return float64(buf[2]) + float64(buf[3])/256, nil
}