package main

import (
	"context"
	"flag"
	"fmt"
	"time"

	"lol.mleku.dev/chk"
	"lol.mleku.dev/log"
	"next.orly.dev/pkg/interfaces/signer/p8k"
	"next.orly.dev/pkg/encoders/event"
	"next.orly.dev/pkg/encoders/kind"
	"next.orly.dev/pkg/encoders/tag"
	"next.orly.dev/pkg/protocol/ws"
)

func main() {
	var err error
	url := flag.String("url", "ws://127.0.0.1:3334", "relay websocket URL")
	timeout := flag.Duration("timeout", 20*time.Second, "publish timeout")
	flag.Parse()

	// Minimal client that publishes a single kind 4678 event and reports OK/err
	var rl *ws.Client
	if rl, err = ws.RelayConnect(context.Background(), *url); chk.E(err) {
		log.E.F("connect error: %v", err)
		return
	}
	defer rl.Close()

	var signer *p8k.Signer
	if signer, err = p8k.New(); chk.E(err) {
		log.E.F("signer create error: %v", err)
		return
	}
	if err = signer.Generate(); chk.E(err) {
		log.E.F("signer generate error: %v", err)
		return
	}

	ev := &event.E{
		CreatedAt: time.Now().Unix(),
		Kind:      kind.K{K: 4678}.K, // arbitrary custom kind
		Tags:      tag.NewS(),
		Content:   []byte("policy test: expect rejection"),
	}
	if err = ev.Sign(signer); chk.E(err) {
		log.E.F("sign error: %v", err)
		return
	}

	ctx, cancel := context.WithTimeout(context.Background(), *timeout)
	defer cancel()

	if err = rl.Publish(ctx, ev); err != nil {
		// Expected path if policy rejects: client returns error with reason (from OK false)
		fmt.Println("policy reject:", err)
		return
	}

	log.I.Ln("publish result: accepted")
	fmt.Println("ACCEPT")
}
