import { SlashCommandBuilder, EmbedBuilder, MessageFlags } from "discord.js"
import type { ChatInputCommandInteraction, MessageReaction, User } from "discord.js"
import { search, repo, torrent, download, magnet } from "@/utils/crack"
import type { CrackGame } from "@/types"
import { t } from "@/utils/i18n"

export const data = new SlashCommandBuilder()
	.setName("crack")
	.setDescription("Download a crack from online-fix.me")
	.setDescriptionLocalizations({ fr: "Télécharge un crack sur online-fix.me" })
	.addStringOption(option => option
		.setName("game")
		.setDescription("What game do you want to download?")
		.setNameLocalizations({ fr: "jeu" })
		.setDescriptionLocalizations({ fr: "Quel jeu tu veux télécharger ?" })
		.setRequired(true)
	)

export async function execute(interaction: ChatInputCommandInteraction) {
	await interaction.deferReply()

	const query = interaction.options.getString("game", true)
	let games = await search(query)
	if (!Array.isArray(games)) return interaction.followUp({ content: t(interaction.locale, "salonpostam.crack.no_games_found", { query }), flags: MessageFlags.Ephemeral })

	let game = {} as CrackGame
	if (games.length > 1) {
		games = games.slice(0, 9)

		let list = ""
		for (let i = 0; i < games.length; i++) list += `\n${i + 1}. ${games[i].name} (${games[i].link})`
		const message = await interaction.followUp({ content: t(interaction.locale, "salonpostam.crack.multiple_games_found", { query, list }) })

		const emojis = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣"]
		for (let i = 0; i < games.length; i++) await message.react(emojis[i])

		// Wait for a reaction to be added by the interaction author.
		const filter = (reaction: MessageReaction, user: User) => {
			if (reaction.emoji.name) return (emojis.includes(reaction.emoji.name) && user.id === interaction.user.id)
			return false
		}
		await message.awaitReactions({ filter, max: 1, time: 5000, errors: ["time"] }).then(collected => {
			console.log(collected)
			const reaction = collected.first()
			const index = emojis.indexOf(reaction?.emoji.name ?? "")
			
			if (!games) return
			game = games[index]
		})
		.catch(() => { return interaction.followUp({ content: t(interaction.locale, "salonpostam.crack.selection_timeout"), flags: MessageFlags.Ephemeral }) })
	} else game = games[0]

	const url = await repo(game)
	if (!url) return
	
	const file = await torrent(url)
	if (!file) return
	
	const filePath = await download(url, file)
	if (!filePath) return
	
	const link = magnet(filePath)
	const embed = new EmbedBuilder()
		.setColor("#ffc370")
		.setTitle(game.name)
		.setURL(game.link)
		.setDescription(t(interaction.locale, "salonpostam.crack.game_found", { query, link: `https://angels-dev.fr/magnet/${link}` }))

	await interaction.followUp({ embeds: [embed], files: [filePath] })
}
