package delegationv1

import (
	"crypto/ed25519"
	"testing"
	"time"
)

func FuzzCanonicalClaimsDecoder(f *testing.F) {
	if payload, err := canonicalClaims(compatibilityClaims()); err == nil {
		f.Add(payload)
	}
	f.Add([]byte(`{"jti":`))
	f.Fuzz(func(t *testing.T, data []byte) {
		_, _ = parseCanonicalClaims(data)
	})
}

func FuzzVerify(f *testing.F) {
	vector := compatibilityVector{
		KeyID:             "p6b-fuzz-key-1",
		PrivateSeedBase64: "nWGxne_9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A",
	}
	seed, _ := decodeBase64URLForFuzz(vector.PrivateSeedBase64)
	privateKey := ed25519.NewKeyFromSeed(seed)
	verifier, _ := NewVerifier(VerifierConfig{
		Keys:                  []VerificationKey{{SigningKeyID: vector.KeyID, PublicKey: privateKey.Public().(ed25519.PublicKey), State: KeyStateCurrent}},
		SupportedCapabilities: []string{selectedRootCapability},
	})
	compact, _ := Sign(vector.KeyID, privateKey, compatibilityClaims())
	f.Add([]byte(compact))
	f.Add([]byte("a.b.c"))
	f.Fuzz(func(t *testing.T, data []byte) {
		_, _ = verifier.Verify(string(data), time.Unix(compatibilityClaims().IssuedAt+1, 0), expectedBindings())
	})
}

func decodeBase64URLForFuzz(value string) ([]byte, error) {
	return decodeCanonicalBase64URL(value)
}
