/************************************************************/ /**
*
*	@file: debug.h
*	@author: Martin Fouilleul
*	@date: 13/08/2023
*
*****************************************************************/
#ifndef __DEBUG_H_
#define __DEBUG_H_

#include "platform/platform_debug.h"
#include "util/macros.h"

//----------------------------------------------------------------
// Logging
//----------------------------------------------------------------
#define oc_log_generic(level, msg, ...) oc_log_ext(level, __FUNCTION__, __FILE__, __LINE__, msg, ##__VA_ARGS__)

#define oc_log_error(msg, ...) oc_log_generic(OC_LOG_LEVEL_ERROR, msg, ##__VA_ARGS__)

#ifndef OC_LOG_COMPILE_WARNING
    #define OC_LOG_COMPILE_WARNING 1
#endif

#ifndef OC_LOG_COMPILE_INFO
    #define OC_LOG_COMPILE_INFO 1
#endif

#if OC_LOG_COMPILE_WARNING || OC_LOG_COMPILE_INFO
    #define oc_log_warning(msg, ...) oc_log_generic(OC_LOG_LEVEL_WARNING, msg, ##__VA_ARGS__)

    #if OC_LOG_COMPILE_INFO
        #define oc_log_info(msg, ...) oc_log_generic(OC_LOG_LEVEL_INFO, msg, ##__VA_ARGS__)
    #else
        #define oc_log_info(msg, ...)
    #endif
#else
    #define oc_log_warning(msg, ...)
    #define oc_log_info(msg, ...)
#endif

//----------------------------------------------------------------
// Abort/Assert
//----------------------------------------------------------------

#define OC_ABORT(fmt, ...) oc_abort_ext(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)

#ifdef OC_NO_ASSERT
    #define OC_ASSERT(x, ...)
    #define OC_DEBUG_ASSERT(x, ...)
#else
    #define _OC_ASSERT_(test, fmt, ...) ((test) || (oc_assert_fail(__FILE__, __FUNCTION__, __LINE__, #test, fmt, ##__VA_ARGS__), 0))
    #define OC_ASSERT(test, ...) _OC_ASSERT_(test, OC_VA_NOPT("", ##__VA_ARGS__) OC_ARG1(__VA_ARGS__) OC_VA_COMMA_TAIL(__VA_ARGS__))

    #ifdef OC_DEBUG
        #define OC_DEBUG_ASSERT(x, ...) OC_ASSERT(x, ##__VA_ARGS__)
    #else
        #define OC_DEBUG_ASSERT(x, ...)
    #endif
#endif

#endif //__DEBUG_H_
