//go:build js

package nostr

import (
	"context"
	"os"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

var testRelayURL = func() string {
	url := os.Getenv("TEST_RELAY_URL")
	if url != "" {
		return url
	}
	return "wss://nos.lol"
}()

func TestConnectContext(t *testing.T) {
	// relay client
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()
	r, err := RelayConnect(ctx, testRelayURL)
	assert.NoError(t, err)

	defer r.Close()
}

func TestConnectContextCanceled(t *testing.T) {
	// relay client
	ctx, cancel := context.WithCancel(context.Background())
	cancel() // make ctx expired
	_, err := RelayConnect(ctx, testRelayURL)
	assert.ErrorIs(t, err, context.Canceled)
}

func TestPublish(t *testing.T) {
	// test note to be sent over websocket
	priv, pub := makeKeyPair(t)
	textNote := Event{
		Kind:      KindTextNote,
		Content:   "hello",
		CreatedAt: Timestamp(1672068534), // random fixed timestamp
		Tags:      Tags{[]string{"foo", "bar"}},
		PubKey:    pub,
	}
	err := textNote.Sign(priv)
	assert.NoError(t, err)

	// connect a client and send the text note
	rl := mustRelayConnect(t, testRelayURL)
	err = rl.Publish(context.Background(), textNote)
	assert.NoError(t, err)
}

func makeKeyPair(t *testing.T) (priv, pub string) {
	t.Helper()

	privkey := GeneratePrivateKey()
	pubkey, err := GetPublicKey(privkey)
	assert.NoError(t, err)

	return privkey, pubkey
}

func mustRelayConnect(t *testing.T, url string) *Relay {
	t.Helper()

	rl, err := RelayConnect(context.Background(), url)
	require.NoError(t, err)

	return rl
}