/*
 * Copyright (c) 2026, Chloe M.
 * Provided under the BSD-3 clause.
 *
 * Description:  Fucks and knots the kernel
 * Author:       Chloe M.
 */

#include <drivers/bootvid/fbio.h>
#include <ke/bpal.h>
#include <ex/trace.h>
#include <ke/knot.h>

#define KNOT_REASON(Reason)             \
    ((Reason) >= NELEM(ReasonTable))    \
        ? ReasonTable[0]                \
        : ReasonTable[(Reason)]

/* Reason lookup table */
static const CHAR *ReasonTable[] = {
    [KNOT_MISC] = "unspecified reason",
    [KNOT_UNBOUND_RSRC] = "unbounded resource",
    [KNOT_BAD_BOOT_PROTO] = "bad boot protocol",
    [KNOT_OOM] = "out of memory",
    [KNOT_EXCEPTION] = "fatal exception",
    [KNOT_IRQL_NOT_LTE] = "irql not less than or equal",
    [KNOT_IRQL_NOT_GTE] = "irql not greater than or equal",
    [KNOT_BAD_CHECKSUM] = "bad checksum",
    [KNOT_MISSING_HARDWARE] = "missing hardware"
};

/* Globals */
static CHAR KnotBuf[256];
static va_list Ap;
static BOOTCONS_ATTR KnotAttr = {
    .Background = 0x000080,
    .Foreground = 0xFFFFFF
};

static CHAR KnotMessage[] = {
    "SystemPaw 3 has ran into a wittle issue and the kernel pilot kitty\n"
    "has suspended the CPU to prevent damage to your machine.\n\n"
    "Press and hold the power button until the screen blanks.\n\n"
};

VOID
KiKnot(KNOT_REASON Reason, const CHAR *Fmt, ...)
{
    va_start(Ap, Fmt);
    FmtPrintf(KnotBuf, sizeof(KnotBuf), Fmt, Ap);

    if (KeBpalIsInit()) {
        BootVidInitCons(&KnotAttr);
    }

    TRACE("\033[H\033[2J");
    TRACE(KnotMessage);
    TRACE("knot: %s", KnotBuf);
    TRACE("reason: %s\n", KNOT_REASON(Reason));
}
