/**
 * @file assets.c
 * @brief Implements the assets subsystem.
 */

#include <SDL3/SDL.h>
#include <SDL3_image/SDL_image.h>
#include <SDL3_mixer/SDL_mixer.h>
#include <akerror.h>
#include <akgl/game.h>
#include <akgl/staticstring.h>
#include <akgl/heap.h>
#include <akgl/error.h>

akerr_ErrorContext *akgl_load_start_bgm(char *fname)
{
    PREPARE_ERROR(errctx);
    //akgl_String *tmpstr = NULL;
    MIX_Track *bgmtrack = NULL;
    SDL_PropertiesID bgmprops = 0;

    ATTEMPT {
	FAIL_ZERO_BREAK(errctx, fname, AKERR_NULLPOINTER, "akgl_load_start_bgm received NULL filename");
	//CATCH(errctx, akgl_heap_next_string(&tmpstr));
	//CATCH(errctx, akgl_string_initialize(tmpstr, NULL));

	SDL_Log("Loading music asset from %s", fname);
	akgl_bgm = MIX_LoadAudio(akgl_mixer, fname, true);
	FAIL_ZERO_BREAK(errctx, akgl_bgm, AKERR_NULLPOINTER, "Failed to load music asset %s : %s", fname, SDL_GetError());

	bgmtrack = MIX_CreateTrack(akgl_mixer);
	FAIL_ZERO_BREAK(errctx, bgmtrack, AKERR_NULLPOINTER, "Failed to create audio track for background music: %s", SDL_GetError());

	akgl_tracks[AKGL_GAME_AUDIO_TRACK_BGM] = bgmtrack;

	FAIL_ZERO_BREAK(
	    errctx,
	    MIX_SetTrackAudio(bgmtrack, akgl_bgm),
	    AKGL_ERR_SDL,
	    "%s",
	    SDL_GetError());

	SDL_SetNumberProperty(bgmprops, MIX_PROP_PLAY_LOOPS_NUMBER, -1);

	if (!MIX_PlayTrack(bgmtrack, bgmprops)) {
	    FAIL_BREAK(errctx, AKGL_ERR_SDL, "Failed to play music asset %s", fname);
	}
    } CLEANUP {
	//IGNORE(akgl_heap_release_string(tmpstr));
	if ( errctx != NULL ) {
	    if ( errctx->status != 0 && akgl_bgm != NULL) {
		MIX_DestroyAudio(akgl_bgm);
	    }
	}
    } PROCESS(errctx) {
    } FINISH(errctx, true);
    SUCCEED_RETURN(errctx);
}
