package main

import (
	"crypto/sha1"
	"fmt"
	"git.hpds.cc/Component/network/log"
	"git.hpds.cc/pavement/hpds_node"
	"os"
	"sync/atomic"
	"time"
)

const ImageDataKey = 0x10

var (
	counter uint64
)

func main() {
	sf := hpds_node.NewStreamFunction(
		"echo-sf",
		hpds_node.WithMqAddr("localhost:27187"),
		hpds_node.WithObserveDataTags(ImageDataKey),
		hpds_node.WithCredential("token:z1"),
	)
	defer sf.Close()

	sf.SetHandler(Handler)

	err := sf.Connect()
	if err != nil {
		log.Printf("Connect to MQ failure: ", err)
		os.Exit(1)
	}

	select {}
}

// Handler process the data in the stream
func Handler(img []byte) (byte, []byte) {
	// Initialize WasmEdge's VM
	//vmConf, vm := initVM()
	//bg := bindgen.Instantiate(vm)
	//defer bg.Release()
	//defer vm.Release()
	//defer vmConf.Release()
	//
	//// recognize the image
	//res, err := bg.Execute("infer", img)
	//if err == nil {
	//	fmt.Println("GO: Run bindgen -- infer:", string(res[0].([]byte)))
	//} else {
	//	fmt.Println("GO: Run bindgen -- infer FAILED")
	//}
	id := atomic.AddUint64(&counter, 1)
	str := fmt.Sprintf("%d", time.Now().UnixNano()/1e6)
	tick := time.Now().Format("20060102150405") + str[10:]
	go WriteFile(fmt.Sprintf("./%d_%s.jpeg", id, tick), img)

	// print logs
	hash := genSha1(img)
	log.Printf("received image-%d hash %v, img_size=%d \n", id, hash, len(img))

	return 0x11, nil
}

// genSha1 generate the hash value of the image
func genSha1(buf []byte) string {
	h := sha1.New()
	h.Write(buf)
	return fmt.Sprintf("%x", h.Sum(nil))
}

func WriteFile(fn string, data []byte) {
	err := os.WriteFile(fn, data, 777)
	if err != nil {
		log.Printf("write file error =%v \n", err)
	}
}