#pragma once
#ifndef JSON_H_
#define JSON_H_

#include <Windows.h>

// ==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
// Structures Defintions

typedef enum _JSON_TYPE 
{
    JSON_TYPE_NULL,
    JSON_TYPE_BOOLEAN,
    JSON_TYPE_NUMBER,
    JSON_TYPE_STRING,
    JSON_TYPE_OBJECT,
    JSON_TYPE_ARRAY
} JSON_TYPE, *PJSON_TYPE;

typedef struct _JSON_VALUE JSON_VALUE, * PJSON_VALUE;
typedef struct _JSON_PAIR JSON_PAIR, * PJSON_PAIR;

typedef struct _JSON_PAIR 
{
    LPSTR       pszKey;
    PJSON_VALUE pValue;
    PJSON_PAIR  pNext;
} JSON_PAIR;

typedef struct _JSON_VALUE 
{
    JSON_TYPE type;
    union 
    {
        BOOL        bValue;
        LONGLONG    llValue;
        LPSTR       pszValue;
        PJSON_PAIR  pObject;
        PJSON_VALUE pArray;
    };
    PJSON_VALUE pNext;  

} JSON_VALUE;


typedef struct _JSON_PARSER 
{
    LPCSTR  pszJson;
    SIZE_T  nPos;
    SIZE_T  nLength;
} JSON_PARSER, * PJSON_PARSER;

// ==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
// Parser Functions

PJSON_VALUE JsonParse(LPCSTR pszJson);
VOID JsonFree(PJSON_VALUE pValue);
PJSON_VALUE JsonGetObject(PJSON_VALUE pObject, LPCSTR pszKey);
LPSTR JsonGetString(PJSON_VALUE pValue);
LONGLONG JsonGetNumber(PJSON_VALUE pValue);

// ==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
// Builder Functions

PJSON_VALUE JsonCreateObject();
PJSON_VALUE JsonCreateString(LPCSTR pszValue);
PJSON_VALUE JsonCreateNumber(LONGLONG llValue);
PJSON_VALUE JsonCreateBoolean(BOOL bValue);
PJSON_VALUE JsonCreateArray();
VOID JsonObjectAdd(PJSON_VALUE pObject, LPCSTR pszKey, PJSON_VALUE pValue);
LPSTR JsonStringify(PJSON_VALUE pValue, PDWORD pdwLength);
VOID JsonArrayAdd(PJSON_VALUE pArray, PJSON_VALUE pValue);

// ==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==


#endif // !JSON_H_
