use crate::{
  chat::{edit_response, process_message},
  commands::audio::queue::clear_queue,
  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(g) => g,
    None => {
      edit_response(
        ctx,
        command,
        "Unable to find the current server ID".to_string(),
      )
      .await;
      return;
    }
  };

  // Stop the track and clear the queue
  match stop_track(manager, &guild_id).await {
    Ok(_) => {
      log::debug!("<{guild_id}> Stopped the track");
      edit_response(ctx, command, "Stopping the tracks".to_string()).await;
    }
    Err(err) => edit_response(ctx, command, format!("Failed to stop: {}", err)).await,
  }
}

pub async fn stop_track(manager: &Arc<Songbird>, guild_id: &GuildId) -> Result<(), String> {
  if let Some(handler_lock) = manager.get(guild_id.to_owned()) {
    let handler = handler_lock.lock().await;
    handler.queue().stop();
    clear_queue(guild_id.get());
    Ok(())
  } else {
    Err("No active audio session in this guild".to_string())
  }
}

pub fn register() -> CreateCommand {
  CreateCommand::new("stop").description("Stop the current track and clear the queue")
}
