package com.sedmelluq.discord.lavaplayer.player.event;

import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;

/**
 * Adapter for different event handlers as method overrides
 */
public abstract class AudioEventAdapter implements AudioEventListener {
  /**
   * @param player Audio player
   */
  public void onPlayerPause(AudioPlayer player) {
    // Adapter dummy method
  }

  /**
   * @param player Audio player
   */
  public void onPlayerResume(AudioPlayer player) {
    // Adapter dummy method
  }

  /**
   * @param player Audio player
   * @param track Audio track that started
   */
  public void onTrackStart(AudioPlayer player, AudioTrack track) {
    // Adapter dummy method
  }

  /**
   * @param player Audio player
   * @param track Audio track that ended
   * @param endReason The reason why the track stopped playing
   */
  public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
    // Adapter dummy method
  }

  /**
   * @param player Audio player
   * @param track Audio track where the exception occurred
   * @param exception The exception that occurred
   */
  public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception) {
    // Adapter dummy method
  }

  /**
   * @param player Audio player
   * @param track Audio track where the exception occurred
   * @param thresholdMs The wait threshold that was exceeded for this event to trigger
   */
  public void onTrackStuck(AudioPlayer player, AudioTrack track, long thresholdMs) {
    // Adapter dummy method
  }

  public void onTrackStuck(AudioPlayer player, AudioTrack track, long thresholdMs, StackTraceElement[] stackTrace) {
    onTrackStuck(player, track, thresholdMs);
  }

  @Override
  public void onEvent(AudioEvent event) {
    if (event instanceof PlayerPauseEvent) {
      onPlayerPause(event.player);
    } else if (event instanceof PlayerResumeEvent) {
      onPlayerResume(event.player);
    } else if (event instanceof TrackStartEvent) {
      onTrackStart(event.player, ((TrackStartEvent) event).track);
    } else if (event instanceof TrackEndEvent) {
      onTrackEnd(event.player, ((TrackEndEvent) event).track, ((TrackEndEvent) event).endReason);
    } else if (event instanceof TrackExceptionEvent) {
      onTrackException(event.player, ((TrackExceptionEvent) event).track, ((TrackExceptionEvent) event).exception);
    } else if (event instanceof TrackStuckEvent) {
      TrackStuckEvent stuck = (TrackStuckEvent) event;
      onTrackStuck(event.player, stuck.track, stuck.thresholdMs, stuck.stackTrace);
    }
  }
}