#include <ultra64.h>
#include <global.h>
#include <vt.h>

void func_80092320(PreNMIContext* prenmiCtx) {
    prenmiCtx->state.running = false;
    prenmiCtx->state.init = NULL;
    prenmiCtx->state.size = 0;
}

void PreNMI_Update(PreNMIContext* prenmiCtx) {
    osSyncPrintf(VT_COL(YELLOW, BLACK) "prenmi_move\n" VT_RST);

    // Strings existing only in rodata
    ("../z_prenmi.c");
    ("(int)volume = %d\n");

    if (prenmiCtx->timer == 0) {
        ViConfig_UpdateVi(1);
        func_80092320(prenmiCtx);
        return;
    }

    prenmiCtx->timer--;
}

void PreNMI_Draw(PreNMIContext* prenmiCtx) {
    GraphicsContext* gfxCtx = prenmiCtx->state.gfxCtx;
    Gfx* dispRefs[5];

    osSyncPrintf(VT_COL(YELLOW, BLACK) "prenmi_draw\n" VT_RST);

    Graph_OpenDisps(dispRefs, gfxCtx, "../z_prenmi.c", 96);

    gSPSegment(gfxCtx->polyOpa.p++, 0x00, NULL);
    func_80095248(gfxCtx, 0, 0, 0);
    func_800940B0(gfxCtx);
    gDPSetFillColor(gfxCtx->polyOpa.p++,
                    (GPACK_RGBA5551(0xFF, 0xFF, 0xFF, 1) << 16) | GPACK_RGBA5551(0xFF, 0xFF, 0xFF, 1));
    gDPFillRectangle(gfxCtx->polyOpa.p++, 0, prenmiCtx->timer + 100, SCREEN_WIDTH - 1, prenmiCtx->timer + 100);

    Graph_CloseDisps(dispRefs, gfxCtx, "../z_prenmi.c", 112);
}

void PreNMI_Main(PreNMIContext* prenmiCtx) {
    PreNMI_Update(prenmiCtx);
    PreNMI_Draw(prenmiCtx);

    prenmiCtx->state.unk_A0 = 1;
}

void PreNMI_Destroy(PreNMIContext* prenmiCtx) {
}

void PreNMI_Init(PreNMIContext* prenmiCtx) {
    prenmiCtx->state.main = PreNMI_Main;
    prenmiCtx->state.destroy = PreNMI_Destroy;
    prenmiCtx->timer = 30;
    prenmiCtx->unk_A8 = 10;

    R_UPDATE_RATE = 1;
}
