#ifndef POKEPLATINUM_PC_BOXES_H
#define POKEPLATINUM_PC_BOXES_H

#include "struct_decls/pc_boxes_decl.h"

#include "pokemon.h"
#include "strbuf.h"

#define MAX_PC_BOXES              18
#define MAX_PC_ROWS               5
#define MAX_PC_COLS               6
#define MAX_MONS_PER_BOX          (MAX_PC_ROWS * MAX_PC_COLS)
#define MAX_DEFAULT_WALLPAPERS    16
#define MAX_UNLOCKABLE_WALLPAPERS 8
#define MAX_WALLPAPERS            (MAX_DEFAULT_WALLPAPERS + MAX_UNLOCKABLE_WALLPAPERS)
#define PC_BOX_NAME_BUFFER_LEN    20

#define USE_CURRENT_BOX -1

void PCBoxes_Init(PCBoxes *pcBoxes);
u32 PCBoxes_SaveSize(void);
BOOL PCBoxes_TryStoreBoxMon(PCBoxes *pcBoxes, BoxPokemon *boxMon);
BOOL PCBoxes_TryStoreBoxMonInBox(PCBoxes *pcBoxes, u32 boxID, BoxPokemon *boxMon);
BOOL PCBoxes_TryStoreBoxMonAt(PCBoxes *pcBoxes, u32 boxID, u32 monPosInBox, BoxPokemon *boxMon);
void PCBoxes_InitBoxMonAt(PCBoxes *pcBoxes, u32 boxID, u32 monPosInBox);
u32 PCBoxes_GetCurrentBoxID(const PCBoxes *pcBoxes);
u32 PCBoxes_FirstEmptyBox(const PCBoxes *pcBoxes);
BOOL PCBoxes_TryGetNextAvailableSpace(const PCBoxes *pcBoxes, int *boxIndexDest, int *monPosInBoxDest);
u32 PCBoxes_CountAllBoxMons(const PCBoxes *pcBoxes);
void PCBoxes_SetCurrentBox(PCBoxes *pcBoxes, u32 boxID);
u32 PCBoxes_GetWallpaper(const PCBoxes *pcBoxes, u32 boxID);
void PCBoxes_SetWallpaper(PCBoxes *pcBoxes, u32 boxID, u32 wallpaper);
void PCBoxes_BufferBoxName(const PCBoxes *pcBoxes, u32 boxID, Strbuf *dest);
void PCBoxes_RenameBox(PCBoxes *pcBoxes, u32 boxID, const Strbuf *newName);
u32 PCBoxes_CountMonsInBox(const PCBoxes *pcBoxes, u32 boxID);
u32 PCBoxes_CountNonEggMonsInBox(const PCBoxes *pcBoxes, u32 boxID);
u32 PCBoxes_CountAllNonEggBoxMons(const PCBoxes *pcBoxes);
u32 PCBoxes_GetBoxMonData(const PCBoxes *pcBoxes, u32 boxID, u32 slot, enum PokemonDataParam pokemonData, void *dest);
void PCBoxes_SetBoxMonData(PCBoxes *pcBoxes, u32 boxID, u32 slot, enum PokemonDataParam pokemonData, void *value);
BoxPokemon *PCBoxes_GetBoxMonAt(const PCBoxes *pcBoxes, u32 boxID, u32 slot);
void PCBoxes_UnlockWallpaper(PCBoxes *pcBoxes, u32 wallpaper);
BOOL PCBoxes_CheckHasUnlockedWallpaper(const PCBoxes *pcBoxes, u32 wallpaper);
u32 PCBoxes_CountUnlockedWallpapers(const PCBoxes *pcBoxes);

#endif // POKEPLATINUM_PC_BOXES_H
