const { Command } = require('discord-akairo');
const textToSpeech = require('@google-cloud/text-to-speech');
const rand = require('../../../rand.js');
const gclient = new textToSpeech.TextToSpeechClient();
const fs = require('fs');
const os = require('os');

class TtsvcCommand extends Command {
	constructor() {
		super('ttsvc', {
			aliases: ['ttsvc'],
			category: 'fun',
			clientPermissions: ['SPEAK'],
			args: [
				{
					id: 'text',
					type: 'string',
					prompt: {
						start: 'Write something so i can say it back in Google tts',
					},
					match: 'rest'
				}
			],
			description: {
				content: 'Say what you wrote in voice channel',
				usage: '[text]',
				examples: ['hello']
			}
		});
	}

	async exec(message, args) {
		let text = args.text;
		let output = `${os.tmpdir()}/${message.id}_tts.mp3`;

		text = rand.random(text, message);

		// Construct the request
		const request = {
			input: { text: text },
			// Select the language and SSML Voice Gender (optional)
			voice: { languageCode: 'en-US', ssmlGender: 'NEUTRAL' },
			// Select the type of audio encoding
			audioConfig: { audioEncoding: 'MP3' },
		};

		// Performs the Text-to-Speech request
		gclient.synthesizeSpeech(request, (err, response) => {
			if (err) {
				console.error('ERROR:', err);
				return;
			}

			// Write the binary audio content to a local file
			fs.writeFile(output, response.audioContent, 'binary', async err => {
				if (err) {
					console.error('ERROR:', err);
					message.channel.send('An error has occured, the message is probably too long');
					
					return;
				}

				const voiceChannel = message.member.voice.channel;
				if (!voiceChannel) return message.channel.send('Please enter a voice channel first.');
				try {
					const connection = await voiceChannel.join();
					const dispatcher = connection.play(output);
					dispatcher.once('finish', () => voiceChannel.leave());
					dispatcher.once('error', () => voiceChannel.leave());
					return null;
				} catch (err) {
					voiceChannel.leave();
					return message.reply(`Oh no, an error occurred: \`${err.message}\`.`);
				}
			});
		});
	}
}
module.exports = TtsvcCommand;