use crate::{
  chat::{edit_response, process_message},
  error::{Error, Result},
  handler::get_songbird,
};
use serenity::{
  all::{CommandInteraction, CreateCommand, GuildId},
  prelude::*,
};
use songbird::Songbird;
use std::sync::Arc;

pub async fn run(ctx: &Context, command: &CommandInteraction) {
  // Create the initial response
  process_message(ctx, command, false).await;

  // Get the songbird manager
  let manager = get_songbird();

  // Extract the guild ID
  let guild_id = match &command.guild_id {
    Some(guild_id) => guild_id,
    None => {
      edit_response(
        ctx,
        command,
        "Unable to find the current server ID".to_string(),
      )
      .await;
      return;
    }
  };

  // Pause the track
  match pause_track(manager, guild_id).await {
    Ok(_) => {
      log::debug!("<{guild_id}> Paused the track");
      edit_response(ctx, command, "Pausing the track".to_string()).await;
    }
    Err(err) => edit_response(ctx, command, format!("Failed to pause: {}", err)).await,
  }
}

pub async fn pause_track(manager: &Arc<Songbird>, guild_id: &GuildId) -> Result<()> {
  if let Some(handler_lock) = manager.get(guild_id.to_owned()) {
    let handler = handler_lock.lock().await;
    match handler.queue().current() {
      Some(track) => track.pause()?,
      None => {
        return Err(Error {
          status: 404,
          details: "No track is currently playing".to_string(),
        });
      }
    }
  };

  Ok(())
}

pub fn register() -> CreateCommand {
  CreateCommand::new("pause").description("Pause the current track")
}
