package com.riiablo.audio;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.FileHandleResolver;
import com.badlogic.gdx.assets.loaders.MusicLoader;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.files.FileHandle;

import org.apache.commons.lang3.Validate;

import java.lang.ref.WeakReference;

public class VolumeControlledMusicLoader extends MusicLoader implements VolumeControlled<Music> {

  @Nullable
  private VolumeController<Music> controller;

  public VolumeControlledMusicLoader(@NonNull FileHandleResolver resolver,
                                     @NonNull VolumeController<Music> controller) {
    super(resolver);
    this.controller = Validate.notNull(controller, "VolumeController cannot be null");
  }

  @Override
  public void setVolumeController(@NonNull VolumeController<Music> controller) {
    this.controller = Validate.notNull(controller, "VolumeController cannot be null");
  }

  @Nullable
  @Override
  public VolumeController<Music> getVolumeController() {
    return controller;
  }

  @Override
  public void loadAsync(AssetManager manager, String fileName, FileHandle file,
                        MusicParameter parameter) {
    super.loadAsync(manager, fileName, file, parameter);
    final Music music = getLoadedMusic();
    if (controller != null) {
      music.setVolume(controller.getVolume());
      controller.manage(new WeakReference<>(music));
    }
  }
}