// ===========================================================================
// Asshat-Gaming Roleplay
// https://github.com/VortrexFTW/gtac_asshat_rp
// Copyright (c) 2021 Asshat-Gaming (https://asshatgaming.com)
// ---------------------------------------------------------------------------
// FILE: database.js
// DESC: Provides database handling, functions and usage
// TYPE: Server (JavaScript)
// ===========================================================================

// -------------------------------------------------------------------------

let databaseConfig = {
	host: "127.0.0.1",
	user: "gtac_main",
	pass: "d8NEzoNIFadanisuKuzEgOSOxOjiG6",
	name: "gtac_main",
	port: 3306,
	usePersistentConnection: true,
}

let persistentDatabaseConnection = null;

// -------------------------------------------------------------------------

function initDatabaseScript() {
	logToConsole(LOG_DEBUG, "[Asshat.Database]: Initializing database script ...");
	logToConsole(LOG_DEBUG, "[Asshat.Database]: Database script initialized successfully!");
}

// -------------------------------------------------------------------------

function connectToDatabase() {
	if(persistentDatabaseConnection == null) {
		logToConsole(LOG_DEBUG, "[Asshat.Database] Initializing database connection ...");
		persistentDatabaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port);
		if(persistentDatabaseConnection.error) {
			console.warn("[Asshat.Database] Database connection error: " + toString(persistentDatabaseConnection.error));
			persistentDatabaseConnection = null;
			return false;
		}

		logToConsole(LOG_DEBUG, "[Asshat.Database] Database connection successful!");
		return persistentDatabaseConnection;
	} else {
		//logToConsole(LOG_DEBUG, "[Asshat.Database] Using existing database connection.");
		return persistentDatabaseConnection;
	}
}

// -------------------------------------------------------------------------

function disconnectFromDatabase(dbConnection) {
	if(!databaseConfig.usePersistentConnection) {
		dbConnection.close();
	}
	return true;
}

// -------------------------------------------------------------------------

function queryDatabase(dbConnection, queryString) {
	return dbConnection.query(queryString);
}

// -------------------------------------------------------------------------

function escapeDatabaseString(dbConnection, unsafeString) {
	if(!dbConnection) {
		dbConnection = connectToDatabase();
	}
	return dbConnection.escapeString(unsafeString);
}

// -------------------------------------------------------------------------

function getDatabaseInsertId(dbConnection) {
	return dbConnection.insertId;
}

// -------------------------------------------------------------------------

function getQueryNumRows(dbQuery) {
	return dbQuery.numRows;
}

// -------------------------------------------------------------------------

function getDatabaseError(dbConnection) {
	return dbConnection.error;
}

// -------------------------------------------------------------------------

function freeDatabaseQuery(dbQuery) {
	dbQuery.free();
	return;
}

// -------------------------------------------------------------------------

function fetchQueryAssoc(dbQuery) {
	return dbQuery.fetchAssoc();
}

// -------------------------------------------------------------------------

function quickDatabaseQuery(queryString) {
	let dbConnection = connectToDatabase();
	let insertId = 0;
	if(dbConnection) {
		let dbQuery = queryDatabase(dbConnection, queryString);
		if(getDatabaseInsertId(dbConnection)) {
			insertId = getDatabaseInsertId(dbConnection);
		}

		if(dbQuery) {
			freeDatabaseQuery(dbQuery);
		}

		disconnectFromDatabase(dbConnection);

		if(insertId != 0) {
			return insertId;
		}

		return true;
	}
	return false;
}

// -------------------------------------------------------------------------

function executeDatabaseQueryCommand(command, params, client) {
	if(getCommand(command).requireLogin) {
		if(!isPlayerLoggedIn(client)) {
			messagePlayerError(client, "You must be logged in to use this command!");
			return false;
		}
	}

	if(!doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(command))) {
		messagePlayerError(client, "You do not have permission to use this command!");
		return false;
	}

	if(areParamsEmpty(params)) {
		messagePlayerSyntax(client, getCommandSyntaxText(command));
		return false;
	}

	if(!targetClient) {
		messagePlayerError(client, "That player was not found!");
		return false;
	}

	if(targetCode == "") {
		messagePlayerError(client, "You didn't enter any code!");
		return false;
	}

	let success = quickDatabaseQuery(params);

	if(!success) {
		messagePlayerAlert(client, `Database query failed to execute: [#AAAAAA]${query}`);
	} else if(typeof success != "boolean") {
		messagePlayeSuccess(client, `Database query successful: [#AAAAAA]${query}`);
		messagePlayerInfo(client, `Returns: ${success}`);
	} else {
		messagePlayeSuccess(client, `Database query successful: [#AAAAAA]${query}`);
	}
	return true;
}

// -------------------------------------------------------------------------