// SPDX-License-Identifier: 0BSD
// Copyright (c) 2024-2026 Sudo-Ivan / Quad4.io
//go:build js && wasm
// +build js,wasm

package main

import (
	"encoding/hex"
	"fmt"
	"syscall/js"

	"git.quad4.io/Networks/Reticulum-Go/pkg/wasm"
	"git.quad4.io/RNS-Things/reticulum-go-mf/pkg/mf"
)

var messenger *mf.Messenger

func main() {
	// Register the generic WASM bridge functions first
	wasm.RegisterJSFunctions()

	// Add chat-specific functions to the "reticulum" JS object
	reticulum := js.Global().Get("reticulum")
	reticulum.Set("sendMessage", js.FuncOf(SendMessage))
	reticulum.Set("sendAnnounce", js.FuncOf(SendAnnounce))

	// Keep the Go program running
	select {}
}

func SendMessage(this js.Value, args []js.Value) interface{} {
	if len(args) < 2 {
		return js.ValueOf(map[string]interface{}{
			"error": "Destination hash and message required",
		})
	}

	destHashHex := args[0].String()
	message := args[1].String()

	destHash, err := hex.DecodeString(destHashHex)
	if err != nil {
		return js.ValueOf(map[string]interface{}{
			"error": fmt.Sprintf("Invalid destination hash: %v", err),
		})
	}

	// Initialize messenger if not already done
	if messenger == nil {
		t := wasm.GetTransport()
		d := wasm.GetDestinationPointer()
		if t == nil || d == nil {
			return js.ValueOf(map[string]interface{}{
				"error": "Reticulum not initialized",
			})
		}
		messenger = mf.NewMessenger(t, d)
	}

	// Use the high-level Messenger from mf package
	if err := messenger.SendMessage(destHash, message); err != nil {
		return js.ValueOf(map[string]interface{}{
			"error": fmt.Sprintf("Send failed: %v", err),
		})
	}

	return js.ValueOf(map[string]interface{}{
		"success": true,
	})
}

func SendAnnounce(this js.Value, args []js.Value) interface{} {
	var appData []byte
	if len(args) >= 1 && args[0].String() != "" {
		appData = []byte(args[0].String())
	}

	return wasm.SendAnnounce(appData)
}
