//
// d_msg_scrn_kanban
//

#include "d/dolzel.h" // IWYU pragma: keep

#include "JSystem/J2DGraph/J2DAnmLoader.h"
#include "JSystem/J2DGraph/J2DGrafContext.h"
#include "JSystem/J2DGraph/J2DScreen.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "d/d_msg_object.h"
#include "d/d_msg_out_font.h"
#include "d/d_msg_scrn_kanban.h"
#include "d/d_pane_class.h"

#if TARGET_PC
#include "dusk/settings.h"
#include "dusk/version.hpp"
#endif

dMsgScrnKanban_c::dMsgScrnKanban_c(JKRExpHeap* param_0) {
    if (param_0 != NULL) {
        field_0xd4 = param_0;
    } else {
        field_0xd4 = dComIfGp_getSubHeap2D(7);
    }

    s32 uVar14 = field_0xd4->getTotalFreeSize();
    init();

    mpScreen = JKR_NEW J2DScreen();
    JUT_ASSERT(43, mpScreen != NULL);
    bool fg =
        mpScreen->setPriority("zelda_kanban_stone_a.blo", 0x1020000, dComIfGp_getMsgArchive(2));
    JUT_ASSERT(45, fg != false);
    dPaneClass_showNullPane(mpScreen);

    OSInitFastCast();

    field_0xcc = (J2DAnmTransform*)J2DAnmLoaderDataBase::load(
        JKRGetNameResource("zelda_kanban_stone_a.bck", dComIfGp_getMsgArchive(2)));
    field_0xd0 = (J2DAnmTextureSRTKey*)J2DAnmLoaderDataBase::load(
        JKRGetNameResource("zelda_kanban_stone_a.btk", dComIfGp_getMsgArchive(2)));
    field_0xd0->searchUpdateMaterialID(mpScreen);
    field_0xd8 = 0.0f;

    mpPmP_c = JKR_NEW CPaneMgr(mpScreen, MULTI_CHAR('n_size'), 2, NULL);
    JUT_ASSERT(60, mpPmP_c != NULL);
    mpPmP_c->getPanePtr()->setAnimation(field_0xcc);

    field_0xcc->setFrame(1.0f);
    mpPmP_c->getPanePtr()->animationTransform();
    mpPmP_c->getPanePtr()->setAnimation((J2DAnmTransform*)NULL);
    mpPmP_c->scale(g_MsgObject_HIO_c.mBoxStoneScaleX, g_MsgObject_HIO_c.mBoxStoneScaleY);

    mpBack_c = JKR_NEW CPaneMgr(mpScreen, MULTI_CHAR('back_b'), 0, NULL);
    JUT_ASSERT(68, mpBack_c != NULL);

    mpSpot_c = JKR_NEW CPaneMgr(mpScreen, MULTI_CHAR('spot00'), 0, NULL);
    JUT_ASSERT(72, mpSpot_c != NULL);

    mpSpot_c->getPanePtr()->setAnimation(field_0xd0);

#if TARGET_PC
    if (dusk::version::isRegionJpn()) {
        if (dComIfGs_getOptRuby() != 0) {
            static u64 const t_tag[3] = {MULTI_CHAR('mg_3line'), 't3_w', 't3_s'};
            for (int i = 0; i < 3; i++) {
                mpTm_c[i] = JKR_NEW CPaneMgr(mpScreen, t_tag[i], 0, NULL);
                ((J2DTextBox*)mpTm_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());
            }

            mpScreen->search(MULTI_CHAR('n_3line'))->show();
            mpScreen->search(MULTI_CHAR('n_3fline'))->hide();
            mpScreen->search(MULTI_CHAR('n_e4line'))->hide();
        } else {
            static u64 const t_tag_2[3] = {MULTI_CHAR('t3fline'), MULTI_CHAR('t3f_w'), MULTI_CHAR('t3f_s')};
            static u64 const tr_tag[3] = {MULTI_CHAR('mg_3f'), MULTI_CHAR('mg_3f_w'), MULTI_CHAR('mg_3f_s')};

            for (int i = 0; i < 3; i++) {
                mpTm_c[i] = JKR_NEW CPaneMgr(mpScreen, t_tag_2[i], 0, NULL);
                ((J2DTextBox*)mpTm_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());

                mpTmr_c[i] = JKR_NEW CPaneMgr(mpScreen, tr_tag[i], 0, NULL);
                ((J2DTextBox*)mpTmr_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());
            }

            mpScreen->search(MULTI_CHAR('n_3line'))->hide();
            mpScreen->search(MULTI_CHAR('n_3fline'))->show();
            mpScreen->search(MULTI_CHAR('n_e4line'))->hide();
        }
    } else {
        static u64 const t_tag[3] = {MULTI_CHAR('mg_e4lin'), 'f4_w', 't4_s'};

        for (int i = 0; i < 3; i++) {
            mpTm_c[i] = JKR_NEW CPaneMgr(mpScreen, t_tag[i], 0, NULL);
            JUT_ASSERT(81, mpTm_c[i] != NULL);
            ((J2DTextBox*)mpTm_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());
        }

        mpScreen->search(MULTI_CHAR('n_3line'))->hide();
        mpScreen->search(MULTI_CHAR('n_3fline'))->hide();
        mpScreen->search(MULTI_CHAR('n_e4line'))->show();
    }
#elif VERSION == VERSION_GCN_JPN
    if (dComIfGs_getOptRuby() != 0) {
        static u64 const t_tag[3] = {MULTI_CHAR('mg_3line'), 't3_w', 't3_s'};
        for (int i = 0; i < 3; i++) {
            mpTm_c[i] = JKR_NEW CPaneMgr(mpScreen, t_tag[i], 0, NULL);
            ((J2DTextBox*)mpTm_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());
        }

        mpScreen->search(MULTI_CHAR('n_3line'))->show();
        mpScreen->search(MULTI_CHAR('n_3fline'))->hide();
        mpScreen->search(MULTI_CHAR('n_e4line'))->hide();
    } else {
        static u64 const t_tag_2[3] = {MULTI_CHAR('t3fline'), MULTI_CHAR('t3f_w'), MULTI_CHAR('t3f_s')};
        static u64 const tr_tag[3] = {MULTI_CHAR('mg_3f'), MULTI_CHAR('mg_3f_w'), MULTI_CHAR('mg_3f_s')};

        for (int i = 0; i < 3; i++) {
            mpTm_c[i] = JKR_NEW CPaneMgr(mpScreen, t_tag_2[i], 0, NULL);
            ((J2DTextBox*)mpTm_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());

            mpTmr_c[i] = JKR_NEW CPaneMgr(mpScreen, tr_tag[i], 0, NULL);
            ((J2DTextBox*)mpTmr_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());
        }

        mpScreen->search(MULTI_CHAR('n_3line'))->hide();
        mpScreen->search(MULTI_CHAR('n_3fline'))->show();
        mpScreen->search(MULTI_CHAR('n_e4line'))->hide();
    }
#else
    static u64 const t_tag[3] = {MULTI_CHAR('mg_e4lin'), 'f4_w', 't4_s'};

    for (int i = 0; i < 3; i++) {
        mpTm_c[i] = JKR_NEW CPaneMgr(mpScreen, t_tag[i], 0, NULL);
        JUT_ASSERT(81, mpTm_c[i] != NULL);
        ((J2DTextBox*)mpTm_c[i]->getPanePtr())->setFont(mDoExt_getMesgFont());
    }

    mpScreen->search(MULTI_CHAR('n_3line'))->hide();
    mpScreen->search(MULTI_CHAR('n_3fline'))->hide();
    mpScreen->search(MULTI_CHAR('n_e4line'))->show();
#endif

    ((J2DTextBox*)mpTm_c[0]->getPanePtr())->getFontSize(mFontSize);
    mTBoxWidth = mpTm_c[0]->getSizeX();
    mTBoxHeight = mpTm_c[0]->getSizeY();
    mLineSpace = ((J2DTextBox*)mpTm_c[0]->getPanePtr())->getLineSpace();
    mCharSpace = ((J2DTextBox*)mpTm_c[0]->getPanePtr())->getCharSpace();
    for (int i = 0; i < 3; i = i + 1) {
        ((J2DTextBox*)mpTm_c[i]->getPanePtr())->setLineSpace(mLineSpace);
        mpTm_c[i]->resize(1.2f * mpTm_c[i]->getSizeX(), mpTm_c[i]->getSizeY());
    }

    mTextBoxPosX = mpTm_c[0]->getGlobalPosX();
    mTextBoxPosY = mpTm_c[0]->CPaneMgr::getGlobalPosY();
    mTextBoxPosOffsetY = 0.0f;

    for (int i = 0; i < 3; i++) {
        if (mpTmr_c[i] != NULL) {
            ((J2DTextBox*)mpTmr_c[i]->getPanePtr())->setLineSpace(mLineSpace);
            if (i == 0) {
                J2DTextBox::TFontSize fontSize;
                ((J2DTextBox*)mpTmr_c[0]->getPanePtr())->getFontSize(fontSize);
                mRubySize = fontSize.mSizeX;
                mRubyCharSpace = ((J2DTextBox*)mpTmr_c[0]->getPanePtr())->getCharSpace();
            }
            mpTmr_c[i]->resize(1.2f * mpTmr_c[i]->getSizeX(), mpTmr_c[i]->getSizeY());
        }
    }

    OS_REPORT("remain ===> %d\n", uVar14 - field_0xd4->getTotalFreeSize());
}

dMsgScrnKanban_c::~dMsgScrnKanban_c() {
    JKR_DELETE(mpScreen);
    mpScreen = NULL;

    JKR_DELETE(field_0xcc);
    field_0xcc = NULL;

    JKR_DELETE(field_0xd0);
    field_0xd0 = NULL;

    JKR_DELETE(mpPmP_c);
    mpPmP_c = NULL;

    JKR_DELETE(mpBack_c);
    mpBack_c = NULL;

    JKR_DELETE(mpSpot_c);
    mpSpot_c = NULL;

    for (int i = 0; i < 3; i++) {
        JKR_DELETE(mpTm_c[i]);
        mpTm_c[i] = NULL;
        if (mpTmr_c[i] != NULL) {
            JKR_DELETE(mpTmr_c[i]);
            mpTmr_c[i] = NULL;
        }
    }

    dComIfGp_getMsgArchive(2)->removeResourceAll();
}

void dMsgScrnKanban_c::exec() {
    field_0xd8 += 1.0f;
    if (field_0xd8 >= field_0xd0->getFrameMax()) {
        field_0xd8 -= field_0xd0->getFrameMax();
    }

    field_0xd0->setFrame(field_0xd8);
    mpScreen->animation();

    if (isTalkNow()) {
        fukiAlpha(1.0f);
    }

    mpPmP_c->scale(g_MsgObject_HIO_c.mBoxStoneScaleX, g_MsgObject_HIO_c.mBoxStoneScaleY);
}

void dMsgScrnKanban_c::draw() {
#if TARGET_PC
    if (dusk::getSettings().game.recordingMode) {
        return;
    }
#endif
    J2DGrafContext* grafContext = dComIfGp_getCurrentGrafPort();
    grafContext->setup2D();
    mpScreen->draw(0.0f, 0.0f, grafContext);
    mpOutFont->draw(NULL, 0.0f, 0.0f, 1.0f);
}

void dMsgScrnKanban_c::fukiAlpha(f32 param_0) {
    mpBack_c->setAlphaRate(param_0);
    mpPmP_c->setAlphaRate(param_0 * g_MsgObject_HIO_c.mBoxStoneAlphaP);
    mpSpot_c->setAlphaRate(param_0);

    for (int i = 0; i < 3; i++) {
        mpTm_c[i]->setAlphaRate(param_0 * mCharAlphaRate);
        if (mpTmr_c[i] != NULL) {
            mpTmr_c[i]->setAlphaRate(param_0 * mCharAlphaRate);
        }
    }
}
void dMsgScrnKanban_c::fukiScale(f32 param_0) {}

void dMsgScrnKanban_c::fukiTrans(f32 param_0, f32 param_1) {}
