use serenity;

use std::sync::Arc;

use super::super::prelude::*;

pub struct List {
    media: Arc<MediaData>,
}

impl List {
    pub fn new(media_data: Arc<MediaData>) -> List {
        List { media: media_data }
    }
}

impl serenity::framework::standard::Command for List {
    #[allow(unreachable_code, unused_mut)]
    fn execute(
        &self,
        _: &mut serenity::client::Context,
        msg: &serenity::model::channel::Message,
        _: serenity::framework::standard::Args,
    ) -> ::std::result::Result<(), serenity::framework::standard::CommandError> {
        let mut output = String::new();

        {
            let playlist_mutex = self.media.playlist_mut();
            let playlist = playlist_mutex.borrow();

            output += &format!(
                "{} {} queued\n",
                playlist.len(),
                if playlist.len() == 1 { "song" } else { "songs" }
            );

            let max_output = 15;

            for (i, song) in playlist.iter().enumerate() {
                if i < max_output {
                    output += &format!("\t{}.\t{}\n", i + 1, song.name.clone());
                } else {
                    output += &format!("\t... and {} more", playlist.len() - max_output);
                }
            }
        }

        print_error!(msg.channel_id.say(output));

        Ok(())
    }
}