const program = require('commander');
const Database = require('./database');
const Bot = require('./bot');
const online = require('./online');

program
	.version('1.0.0')
	.option('-t --token <token>', 'Discord access token')
	.option('-d --database <database>', 'SQLite database file', __dirname + '/maxhass.db')
	.parse(process.argv);

if (typeof program.token === 'undefined') {
	program.help();
}

const database = new Database(program.database, (error) => {
	console.error(error);
	process.exit(2);
}, () => {
	console.info(`Database open: ${program.database}`);
}, (from, to) => {
	if (from === to) {
		console.info(`Database schema is up-to-date.`);
	} else if (from === 0) {
		console.info(`Database schema initialized.`);
	} else {
		console.info(`Database schema upgraded from version #${from} to #${to}.`);
	}
});

const bot = new Bot(program.token, database, error => {
	console.error(error);
	process.exit(3);
}, user => {
	console.info(`Discord bot logged in as ${user.username}#${user.discriminator}.`);
	console.info(`Invitation URL: ${bot.link}`);
	online(user);
});

bot.on('join', guild => {
	console.info(`Bot has joined ${guild.name}.`);
});

bot.on('leave', guild => {
	console.info(`Bot has left ${guild.name}.`);
});

bot.on('message', message => {

	let user = message.author.username + '#' + message.author.discriminator;

	if (message.channel.type === 'dm') {
		if (message.author === bot.discord.user) {
			user += '->' + message.channel.recipient.username + '#' + message.channel.recipient.discriminator;
		} else {
			user += '->' + bot.discord.user.username + '#' + bot.discord.user.discriminator;
		}
	} else {
		user += '@' + message.channel.name;
	}

	if (message.cleanContent.trim().length > 0) {
		console.log(user + ': ' + message.cleanContent.trim());
	}

});