/*
 * NIP-59: Gift Wrap
 * https://github.com/nostr-protocol/nips/blob/master/59.md
 */

#ifndef NOSTR_NIP059_H
#define NOSTR_NIP059_H

#include <stddef.h>
#include <time.h>
#include "../cjson/cJSON.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * NIP-59: Create a rumor (unsigned event)
 *
 * @param kind Event kind
 * @param content Event content
 * @param tags Event tags (cJSON array, can be NULL)
 * @param pubkey_hex Sender's public key in hex format
 * @param created_at Event timestamp (0 for current time)
 * @return cJSON object representing the rumor, or NULL on error
 */
cJSON* nostr_nip59_create_rumor(int kind, const char* content, cJSON* tags,
                               const char* pubkey_hex, time_t created_at);

/**
 * NIP-59: Create a seal (kind 13) wrapping a rumor
 *
 * @param rumor The rumor event to seal (cJSON object)
 * @param sender_private_key 32-byte sender private key
 * @param recipient_public_key 32-byte recipient public key (x-only)
 * @param max_delay_sec Maximum random timestamp delay in seconds (0 = no randomization)
 * @return cJSON object representing the seal event, or NULL on error
 */
cJSON* nostr_nip59_create_seal(cJSON* rumor, const unsigned char* sender_private_key,
                               const unsigned char* recipient_public_key, long max_delay_sec);

/**
 * NIP-59: Create a gift wrap (kind 1059) wrapping a seal
 *
 * @param seal The seal event to wrap (cJSON object)
 * @param recipient_public_key_hex Recipient's public key in hex format
 * @param max_delay_sec Maximum random timestamp delay in seconds (0 = no randomization)
 * @return cJSON object representing the gift wrap event, or NULL on error
 */
cJSON* nostr_nip59_create_gift_wrap(cJSON* seal, const char* recipient_public_key_hex, long max_delay_sec);

/**
 * NIP-59: Unwrap a gift wrap to get the seal
 *
 * @param gift_wrap The gift wrap event (cJSON object)
 * @param recipient_private_key 32-byte recipient private key
 * @return cJSON object representing the seal event, or NULL on error
 */
cJSON* nostr_nip59_unwrap_gift(cJSON* gift_wrap, const unsigned char* recipient_private_key);

/**
 * NIP-59: Unseal a seal to get the rumor
 *
 * @param seal The seal event (cJSON object)
 * @param sender_public_key 32-byte sender public key (x-only)
 * @param recipient_private_key 32-byte recipient private key
 * @return cJSON object representing the rumor event, or NULL on error
 */
cJSON* nostr_nip59_unseal_rumor(cJSON* seal, const unsigned char* sender_public_key,
                               const unsigned char* recipient_private_key);

#ifdef __cplusplus
}
#endif

#endif // NOSTR_NIP059_H