#ifndef D_LYT_UTIL_ITEMS_H
#define D_LYT_UTIL_ITEMS_H

#include "common.h"
#include "sized_string.h"
#include "toBeSorted/dowsing_target.h"

enum LytItemNumberColor_e {
    LYT_ITEM_COLOR_GOLD = 0,
    LYT_ITEM_COLOR_RED = 1,
    LYT_ITEM_COLOR_GREEN = 2,
    LYT_ITEM_COLOR_NONE = 3,
};

enum SongLifeTreeSeedStatus_e {
    SONG_LIFETREE_NONE = 0,
    SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED = 1,
    SONG_LIFETREE_HAS_SOTH = 2,
};

s32 convertLytPouchSlot2(s32 fileSlot);

u8 getSongLifeTreeStatus();

/** 0: no sword, 6: TMS */
s32 getCurrentSwordLevel();
u16 getCurrentSwordItemId();
bool isSwordRestrictedBokoBase();

u16 getCurrentGoddessHarpItemId();
bool isHarpRestrictedBokoBase();

u16 getCurrentEarringsItemId();

u16 getTabletItemIdForIndex(s32 index);

u16 getTriforceItemIdForIndex(s32 index);

u16 getSongItemIdForIndex(s32 index);

bool hasGoddessHarp();

bool hasSong(s32 index);

bool hasWaterDragonScale();
u16 getCurrentWaterDragonScaleItemId();
bool isWaterDragonScaleRestricted();

bool hasSailcloth();

s32 getCurrentMittsLevel();
u16 getCurrentMittsItemId();
bool isMittsRestricted();

u16 getCurrentSailclothItemId();

u16 getCurrentWalletItemId();

u16 getCurrentHeartPieceItemId();

void getItemLabel(s32 itemId, SizedString<32> &buf);
void getCaptionItemLabel(s32 itemId, SizedString<32> &buf);
void getDowsingLabel(s32 itemId, SizedString<32> &buf);
void getPauseCategoryLabel(s32 itemId, SizedString<32> &buf);

// TODO these could be u16
const wchar_t *getItemText(s32 itemId);
const wchar_t *getCaptionItemText(s32 itemId);
const wchar_t *getDowsingText(s32 itemId);
const wchar_t *getPauseCategoryText(s32 itemId);

bool isPouchBocoburinLocked();

// TODO - these return types may require some work

u8 getPouchItemForSlot(s32 slot, bool unk);
bool hasPouchSlot(s32 slot, bool unk);
s32 getPouchItemAmount(s32 slot, bool unk);
u8 getPouchItemNumberColor(s32 slot, bool unk);
// not sure about this one
f32 getPouchShieldDurability(s32 slot, bool unk);
u32 getPouchItemIdForIndex(s32 slot, bool unk);
// not sure about this one
f32 getPouchShieldDurability2(s32 slot, bool unk);
// not sure about this one
s32 getEvenMoreShieldStuff(s32 slot, bool unk);

u8 getDepositItemForSlot(s32 slot);
s32 getDepositItemAmount(s32 slot);
u8 getDepositItemNumberColor(s32 slot);
f32 getDepositShieldDurability(s32 slot);

// TODO - rename and make sense of these
DowsingTarget::DowsingSlot dowsingSlotForIndex(s32 index);
u8 getLytIndexForDowsingIndex(s32 index);
u16 getDowsingItemIdForIndex(s32 index);
bool hasDowsingInIndex(s32 index);

// B-Wheel
s32 getBWheelSlotForIndex(s32 index);
bool isBWheelIndexWithNumber(s32 index);
s32 getNumberForBWheelIndex(s32 index);
s32 getItemLevelForBWheelIndex(s32 index);
u8 getLytItemIdForBWheelIndex(s32 index);
bool isBWheelIndexBocoburinLocked(s32 index, bool unk);
u8 getNumberColorForBWheelIndex(s32 index);
u16 getBWheelItemIdForIndex(s32 index);

/**
 * FR: -1, 0, 1 singular, else plural
 * Otherwise: -1, 1 singular, else plural
 */
bool shouldUseSingular(s32 amount);

#endif
