#ifndef MESHCORE_FRAME_HEADER
#define MESHCORE_FRAME_HEADER

#include "stddef.h"
#include "stdint.h"
#include "lib/cifra/aes.h"
#include "lib/cifra/hmac.h"
#include "packetstructs.h"


#define KEY_SIZE 16  // 128-bit AES
#define HMAC_SIZE 2  // meshcore size
#define MAX_FLOOD_TTL 64
//#define NON_RETX_HISTORY 64
#define NON_RETX_HISTORY 8

int ReadFrame (FrameStruct *frame, int8_t *rssiPacket, int8_t *snrPacket, int8_t *rawSnr);

void LoRaTransmit (const FrameStruct *frame);

/*
FrameStruct decodeFrame (unsigned char *data, unsigned char dataLen);

void sendFrame (const FrameStruct * frame);
*/

void printFrameHeader (const FrameStruct *frame);

// CALL LAST, PATH GETS MODIFIED
void retransmitFrame (FrameStruct *frame);

// Verify MAC + Decrypt

int encrypt_then_mac (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *plaintext, size_t plen, uint8_t *output, size_t *olen);

int mac_then_decrypt (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *input, size_t ilen, uint8_t *plaintext);

void addToNotReTX(const FrameStruct *frame);

typedef struct KnownPacketHistoryType {
    uint8_t hash[32];
    uint8_t populated;
} KnownPacketHistoryType;


#endif