#include "global.h"
#include "gflib.h"
#include "new_menu_helpers.h"
#include "quest_log.h"
#include "script.h"
#include "text_window.h"

static EWRAM_DATA u8 sMessageBoxType = 0;

static void textbox_fdecode_auto_and_task_add(const u8 *str);
static void textbox_auto_and_task_add(void);

void sub_8069348(void)
{
    sMessageBoxType = 0;
    gTextFlags.canABSpeedUpPrint = FALSE;
    gTextFlags.useAlternateDownArrow = FALSE;
    gTextFlags.autoScroll = FALSE;
}

static void Task_RunFieldMessageBoxPrinter(u8 taskId)
{
    struct Task * task = &gTasks[taskId];
    switch (task->data[0])
    {
    case 0:
        if (gQuestLogState == QL_STATE_PLAYBACK)
        {
            gTextFlags.autoScroll = TRUE;
            TextWindow_LoadTilesStdFrame1(0, 0x200);
        }
        else if (!IsMsgSignPost())
        {
            LoadStdWindowFrameGfx();
        }
        else
        {
            LoadSignPostWindowFrameGfx();
        }
        task->data[0]++;
        break;
    case 1:
        DrawDialogueFrame(0, TRUE);
        task->data[0]++;
        break;
    case 2:
        if (RunTextPrinters_CheckPrinter0Active() != TRUE)
        {
            sMessageBoxType = 0;
            DestroyTask(taskId);
        }
        break;
    }
}

static void task_add_textbox(void)
{
    CreateTask(Task_RunFieldMessageBoxPrinter, 80);
}

static void task_del_textbox(void)
{
    u8 taskId = FindTaskIdByFunc(Task_RunFieldMessageBoxPrinter);
    if (taskId != 0xFF)
        DestroyTask(taskId);
}

bool8 ShowFieldMessage(const u8 *str)
{
    if (sMessageBoxType != 0)
        return FALSE;
    textbox_fdecode_auto_and_task_add(str);
    sMessageBoxType = 2;
    return TRUE;
}

bool8 ShowFieldAutoScrollMessage(const u8 *str)
{
    if (sMessageBoxType != 0)
        return FALSE;
    sMessageBoxType = 3;
    textbox_fdecode_auto_and_task_add(str);
    return TRUE;
}

bool8 sub_806948C(const u8 *str)
{
    sMessageBoxType = 3;
    textbox_fdecode_auto_and_task_add(str);
    return TRUE;
}

bool8 sub_80694A4(const u8 *str)
{
    if (sMessageBoxType != 0)
        return FALSE;
    sMessageBoxType = 2;
    textbox_auto_and_task_add();
    return TRUE;
}

static void textbox_fdecode_auto_and_task_add(const u8 *str)
{
    StringExpandPlaceholders(gStringVar4, str);
    AddTextPrinterDiffStyle(TRUE);
    task_add_textbox();
}

static void textbox_auto_and_task_add(void)
{
    AddTextPrinterDiffStyle(TRUE);
    task_add_textbox();
}

void HideFieldMessageBox(void)
{
    task_del_textbox();
    ClearDialogWindowAndFrame(0, TRUE);
    sMessageBoxType = 0;
}

u8 textbox_any_visible(void)
{
    return sMessageBoxType;
}

bool8 IsFieldMessageBoxHidden(void)
{
    if (sMessageBoxType == 0)
        return TRUE;
    else
        return FALSE;
}

void sub_8069538(void)
{
    task_del_textbox();
    DrawStdWindowFrame(0, TRUE);
    sMessageBoxType = 0;
}
