//environment variables
require('dotenv').config();

//utilities
let { log } = require('../common/utilities.js');

const getStatistics = (cb) => {
	//TODO: apiVisible field
	return cb(undefined, { 'statistics': require('./equipment_statistics.json') });
};

const getOwned = (connection, id, cb) => {
	let query = 'SELECT name, quantity FROM equipment WHERE accountId = ?;';
	connection.query(query, [id], (err, results) => {
		if (err) throw err;

		let ret = {};

		Object.keys(results).map((key) => {
			if (ret[results[key].name] !== undefined) {
				log('WARNING: Invalid database state, equipment owned', id, JSON.stringify(results));
			}
			ret[results[key].name] = results[key].quantity;
		});

		return cb(undefined, { 'owned': ret });
	});
};

const isNormalInteger = (str) => {
    let n = Math.floor(Number(str));
    return n !== Infinity && String(n) == str && n >= 0;
};

const isAttacking = (connection, user, cb) => {
	let query;

	if (isNormalInteger(user)) {
		query = 'SELECT * FROM pendingCombat WHERE attackerId = ?;';
	} else if (typeof(user) === 'string') {
		query = 'SELECT * FROM pendingCombat WHERE attackerId IN (SELECT id FROM accounts WHERE username = ?);';
	} else {
		return cb(`isAttacking: Unknown argument type for user: ${typeof(user)}`);
	}

	connection.query(query, [user], (err, results) => {
		if (err) throw err;

		if (results.length === 0) {
			return cb(undefined, false);
		} else {
			//get the username of the person being attacked
			let query = 'SELECT username FROM accounts WHERE id = ?;';
			connection.query(query, [results[0].defenderId], (err, results) => {
				if (err) throw err;
				return cb(undefined, true, results[0].username);
			});
		}
	});
};

const isSpying = (connection, user, cb) => {
	let query;

	if (isNormalInteger(user)) {
		query = 'SELECT * FROM pendingSpying WHERE attackerId = ?;';
	} else if (typeof(user) === 'string') {
		query = 'SELECT * FROM pendingSpying WHERE attackerId IN (SELECT id FROM accounts WHERE username = ?);';
	} else {
		return cb(`isSpying: Unknown argument type for user: ${typeof(user)}`);
	}

	connection.query(query, [user], (err, results) => {
		if (err) throw err;

		if (results.length === 0) {
			return cb(undefined, false);
		} else {
			//get the username of the person being spied on
			let query = 'SELECT username FROM accounts WHERE id = ?;';
			connection.query(query, [results[0].defenderId], (err, results) => {
				if (err) throw err;
				return cb(undefined, true, results[0].username);
			});
		}
	});
};

module.exports = {
	getStatistics: getStatistics,
	getOwned: getOwned,
	isAttacking: isAttacking,
	isSpying: isSpying
};