#ifndef EGG_EXCEPTION_H
#define EGG_EXCEPTION_H

#include "common.h"
#include "nw4r/db/db_console.h"

namespace EGG {

class Heap;
class CoreStatus;

class Exception {
public:
    Exception(u16, u16, u16, EGG::Heap *, int);
    virtual ~Exception();

    static void ExceptionWaitTime(u32 time);
    static bool ExceptionCallback(nw4r::db::ConsoleHandle handle, void *);
    static bool ExceptionCallback_(nw4r::db::ConsoleHandle handle, void *);
    static Exception *create(u16, u16, u16, Heap *, int);

    static Exception *sException;

    static nw4r::db::ConsoleHandle sConsoleHandle;
    static void *sMapFileWorks;
    static u32 sMapFileNumMax;
    static u32 sCurrentMapFileNum;
    static volatile bool sUserCallbackMode;

    // inofficial

    static void (*sPreException)();
    static void (*sUserCallbackFunc)(CoreStatus *status);
    static s16 sExceptionDisplayInfo;

    static void SetUserCallback(void (*cb)(CoreStatus *status));
    static void SetPreExceptionCallback(void (*cb)());
    static void SetCallbackMode(bool);
    static void SetCallbackArgs(void *);
    static nw4r::db::ConsoleHandle GetConsoleHandle();
};

} // namespace EGG

#endif
