package kbgovernance

import (
	"bytes"
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"fmt"
)

type approvalPayload interface {
	WikiGenerationPayload | PublicationPayload
}

// EncodePayload returns the deterministic JSON and SHA-256 digest accepted by
// AgentTeam's generic Approval store for a supported KB governance payload.
func EncodePayload[T approvalPayload](payload T) ([]byte, string, error) {
	encoded, err := json.Marshal(payload)
	if err != nil {
		return nil, "", fmt.Errorf("encode Approval payload: %w", err)
	}
	decoder := json.NewDecoder(bytes.NewReader(encoded))
	decoder.UseNumber()
	var value any
	if err := decoder.Decode(&value); err != nil {
		return nil, "", fmt.Errorf("canonicalize Approval payload: %w", err)
	}
	canonical, err := json.Marshal(value)
	if err != nil {
		return nil, "", fmt.Errorf("encode canonical Approval payload: %w", err)
	}
	digest := sha256.Sum256(canonical)
	return canonical, hex.EncodeToString(digest[:]), nil
}
