package natsauth_test

import (
	"testing"
	"time"

	"github.com/mudler/LocalAI/pkg/natsauth"
	"github.com/nats-io/jwt/v2"
	"github.com/nats-io/nkeys"
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
)

func TestNatsAuth(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "NatsAuth")
}

var _ = Describe("MintWorkerJWT", func() {
	var accountSeed string

	BeforeEach(func() {
		akp, err := nkeys.CreateAccount()
		Expect(err).NotTo(HaveOccurred())
		seed, err := akp.Seed()
		Expect(err).NotTo(HaveOccurred())
		accountSeed = string(seed)
	})

	It("mints a JWT with backend worker permissions", func() {
		cfg := natsauth.Config{AccountSeed: accountSeed, WorkerJWTTTL: time.Hour}
		token, seed, err := cfg.MintWorkerJWT("550e8400-e29b-41d4-a716-446655440000", "backend")
		Expect(err).NotTo(HaveOccurred())
		Expect(token).NotTo(BeEmpty())
		Expect(seed).NotTo(BeEmpty())

		uc, err := jwt.DecodeUserClaims(token)
		Expect(err).NotTo(HaveOccurred())
		Expect(uc.Permissions.Sub.Allow).To(ContainElement("nodes.550e8400-e29b-41d4-a716-446655440000.>"))
		Expect(uc.Permissions.Pub.Allow).To(ContainElement("nodes.550e8400-e29b-41d4-a716-446655440000.backend.install.*.progress"))
	})

	It("mints agent permissions without backend install subscribe", func() {
		cfg := natsauth.Config{AccountSeed: accountSeed}
		token, _, err := cfg.MintWorkerJWT("node-1", "agent")
		Expect(err).NotTo(HaveOccurred())

		uc, err := jwt.DecodeUserClaims(token)
		Expect(err).NotTo(HaveOccurred())
		Expect(uc.Permissions.Sub.Allow).To(ContainElement("agent.execute"))
		for _, subj := range uc.Permissions.Sub.Allow {
			Expect(subj).NotTo(ContainSubstring("backend.install"))
		}
	})

	It("rejects mint without account seed", func() {
		_, _, err := (natsauth.Config{}).MintWorkerJWT("id", "backend")
		Expect(err).To(HaveOccurred())
	})
})
