const {
  Readable: ReadableStream
} = require("stream");
const ytdl = require("ytdl-core");
const {
  streamConfig
} = require("../config/config.js");
const prism = require("prism-media");
const { EmbedBuilder } = require("discord.js");

module.exports = async function (guild, song, client, seek, play) {
  const queue = client.queue.get(guild.id);
  if (!song) {
    queue.voiceChannel.leave();
    queue.exists = false;
    client.queue.delete(guild.id);
    return;
  }
  setTimeout(() => {
    if (!queue.playing && queue.exists) {
      queue.textChannel.send(client.messages.tookTooLong);
      queue.voiceChannel.leave();
      client.queue.delete(guild.id);
      return;
    }
  }, 30000);

  streamConfig.options.seek = seek;

  let input = song.url;
  if (song.type === "ytdl" || song.type === "spotify")
    input = ytdl(song.url, streamConfig.ytdlOptions)
    //.on('info', (info, format) => console.log(format))
    .on("error", (error) => {
      console.log(error)
      queue.voiceChannel.leave();
      client.queue.delete(guild.id);
      queue.textChannel.send(client.messages.videoUnavailable)
    });

  const ffmpegArgs = [
    "-analyzeduration",
    "0",
    "-loglevel",
    "0",
    "-f",
    "s16le",
    "-ar",
    "48000",
    "-ac",
    "2",
    "-af",
    `bass=g=${queue.bass}`,
  ];
  client.funcs.sleep(500);
  if (queue.nightCore) {
    ffmpegArgs.push("-af");
    ffmpegArgs.push("asetrate=52920");
  }

  const isStream = input instanceof ReadableStream;

  const args = isStream ? ffmpegArgs.slice() : ["-i", input, ...ffmpegArgs];
  args.unshift("-ss", String(seek));

  const transcoder = new prism.FFmpeg({
    args: args,
  });

  const stream = input.pipe(transcoder).on("error", (error) => {
    console.log(error);
  });

  const dispatcher = queue.connection.play(stream, streamConfig.options)

  dispatcher.setVolume(queue.volume / 100);

  require("../events/dispatcherEvents/handler")(client, dispatcher, queue, guild);

  if ((client.global.db.guilds[guild.id].startPlaying && play) || play) {
    if (song.type !== "ytdl" && song.type !== "spotify") return;
    const embed = new EmbedBuilder()
      .setTitle(`${client.messages.startPlaying}**${song.title}**`)
      .setDescription(
        `Song duration: \`${client.funcs.msToTime(
          queue.songs[0].info.lengthSeconds * 1000,
          "hh:mm:ss"
        )}\``
      )
      .setColor(client.config.embedColor);
    queue.textChannel.send(embed);
  }
  queue.playing = true;
};