#include <ultra64.h>
#include "functions.h"
#include "variables.h"

#include "core2/ba/physics.h"
#include "core2/yaw.h"

void func_802B3A50(void) {
    f32 sp34;
    f32 plyr_pos[3];
    f32 sp1C[3];

    if (balookat_getState()) {
        playerPosition_get(plyr_pos);
        if (balookat_try_get_position(sp1C) && func_80257F18(plyr_pos, sp1C, &sp34)) {
            yaw_setIdeal(sp34);
        }
    }
}

void func_802B3AAC(enum asset_e anim_id, f32 anim_duration) {
    AnimCtrl *anim_ctrl;

    anim_ctrl = baanim_getAnimCtrlPtr();
    if (anim_id == ASSET_14A_ANIM_BSREST_LISTEN) {
        modelAppendages_setKazooiesUpperHalfVisibility(true);
        switch (anctrl_getIndex(baanim_getAnimCtrlPtr())) {
        case ASSET_14A_ANIM_BSREST_LISTEN:
            baanim_playForDuration_loopSmooth(anim_id, anim_duration);
            break;
        case ASSET_167_ANIM_BSREST_MOVE:
            anctrl_reset(anim_ctrl);
            anctrl_setIndex(anim_ctrl, ASSET_167_ANIM_BSREST_MOVE);
            anctrl_setDuration(anim_ctrl, 0.4f);
            anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
            break;
        default:
            baanim_playForDuration_onceSmooth(ASSET_167_ANIM_BSREST_MOVE, 0.5f);
            anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
            break;
        }
    } else {
        baanim_playForDuration_loopSmooth(anim_id, anim_duration);
    }
    code_14420_setUpdateTypes(1, YAW_STATE_1_DEFAULT, 3, BA_PHYSICS_NORMAL);
    baphysics_set_target_horizontal_velocity(0.0f);
    func_802B3A50();
}


bool func_802B3BB0(void) {
    AnimCtrl *anim_ctrl;
    bool sp20;

    anim_ctrl = baanim_getAnimCtrlPtr();
    func_802B3A50();
    sp20 = false;
    switch(anctrl_getIndex(anim_ctrl)){
        case ASSET_167_ANIM_BSREST_MOVE:
            if (baanim_isStopped() != 0) {
                if (anctrl_isPlayedForwards(anim_ctrl) != 0) {
                    baanim_playForDuration_loopSmooth(ASSET_14A_ANIM_BSREST_LISTEN, 11.4f);
                } else if (balookat_getState() == 0) {
                    sp20 = true;
                }
            }
            break;
        case ASSET_14A_ANIM_BSREST_LISTEN:
            if (balookat_getState() == 0) {
                anctrl_reset(anim_ctrl);
                anctrl_setDirection(anim_ctrl, 0);
                anctrl_setIndex(anim_ctrl, ASSET_167_ANIM_BSREST_MOVE);
                anctrl_setStart(anim_ctrl, 1.0f);
                anctrl_setDuration(anim_ctrl, 0.5f);
                anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
                anctrl_start(anim_ctrl, "bsrest.c", 0xA3);
            }
            break;
        default:
            if (balookat_getState() == 0) {
                sp20 = true;
            }
            break;
    }
    return sp20;
}

void func_802B3CCC(void){ 
    modelAppendages_setKazooiesUpperHalfVisibility(false);
}

void bsrest_bs73unknown_init(void){ 
    enum asset_e anim_id;
    f32 anim_duration;
    
    func_8029BE10(&anim_id, &anim_duration);
    func_802B3AAC(anim_id, anim_duration);
}

void bsrest_bs73unknown_update(void) {
    enum bs_e next_state;

    next_state = 0;
    if (player_inWater() != 0) {
        next_state = BS_77_SWIM_LOOKAT_DRONE;
    }
    if (func_802B3BB0() != 0) {
        next_state = bs_getIdleState();
    }
    bs_setState(next_state);
}

void bsrest_bs73unknown_end(void){ 
    func_802B3CCC();
}

void bsrest_bs75unknown_init(void){ 
    enum asset_e anim_id;
    f32 anim_duration;
    
    func_8029BF00(&anim_id, &anim_duration);
    func_802B3AAC(anim_id, anim_duration);
}


void bsrest_bs75unknown_update(void) {
    enum bs_e next_state;

    next_state = 0;
    if (player_inWater() != 0) {
        next_state = BS_77_SWIM_LOOKAT_DRONE;
    }
    if (func_802B3BB0() != 0) {
        next_state = bs_getIdleState();
    }
    bs_setState(next_state);
}


void bsrest_bs75unknown_end(void){ 
    func_802B3CCC();
}

void bsrest_bs74unknown_init(void){ 
    enum asset_e anim_id;
    f32 anim_duration;
    
    func_8029BE88(&anim_id, &anim_duration);
    func_802B3AAC(anim_id, anim_duration);
    func_8029C674();
}

void bsrest_bs74unknown_update(void) {
    s32 next_state;

    next_state = 0;
    func_8029C6D0();
    if (player_inWater()) {
        next_state = BS_77_SWIM_LOOKAT_DRONE;
    }
    if (func_802B3BB0()) {
        next_state = bs_getIdleState();
    }
    if (gsworld_getMap() == MAP_27_FP_FREEZEEZY_PEAK && baflag_isTrue(BA_FLAG_14_LOSE_BOGGY_RACE)) {
        next_state = func_8029CA94(next_state);
    }
    bs_setState(next_state);
}


void bsrest_bs74unknown_end(void){
    func_802B3CCC();
    func_8029C748();
}