package main

import (
	"encoding/json"
	"fmt"
	"log/slog"
	"sort"

	MQTT "github.com/eclipse/paho.mqtt.golang"
	"github.com/jedib0t/go-pretty/v6/table"
)

// mqttSetup creates a new MQTT client
func mqttSetup(mqttBroker string, port int) MQTT.Client {
	// This JS style of creating a client is awfully verbose
	opts := MQTT.NewClientOptions().
		AddBroker(fmt.Sprintf("tcp://%s:%d", mqttBroker, port)).
		SetClientID(mqttClientID).
		SetDefaultPublishHandler(mqttPublishHander).SetAutoReconnect(true)

	client := MQTT.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		panic(token.Error())
	}
	slog.Debug("Connected to", "Broker", mqttBroker, "Port", port, "Client", mqttClientID)
	if token := client.Subscribe(mqttTopic+"/#", 0, nil); token.Wait() && token.Error() != nil {
		panic(token.Error())
	}
	return client
}

// mqttDumpMsg displays the MQTT message
func mqttDumpMsg(msg MQTT.Message) {
	var data map[string]interface{}
	err := json.Unmarshal(msg.Payload(), &data)
	if err != nil {
		slog.Error("Error decoding JSON %v", "err", err)
	}

	// sort keys
	keys := make([]string, 0, len(data))
	for key := range data {
		keys = append(keys, key)
	}
	sort.Strings(keys)
	// dump keys
	tab := table.NewWriter()
	tab.SetTitle("MQTT update")
	tab.SetStyle(table.StyleRounded)
	for _, key := range keys {
		if key != "update" {
			tab.AppendRow(table.Row{key, data[key]})
		}
	}
	fmt.Println(tab.Render())
}