import * as toml from "toml";
import { Logger } from "tslog";
import { Game } from "./objects/Game";
import startWebsocket from "./websocket";
import { Validate } from "./utils/validate";
import { processExit } from "./utils/cleanup";
import { readdirSync, readFileSync } from "fs";
// import { DiscordTransport } from "./utils/DiscordTransport";

export const conf: config = toml.parse(readFileSync(`server.toml`, `utf-8`));

/*
 * These are the objects that we use to keep track of the different games,
 * there are two different types of game, hibernated, and active. Hibernated
 * games are games which have data associated with them in the datastore, but
 * have not had any requests associated with them since they were hibernated.
 * Active games are games that have active socket connections associated with
 * them or have not been cleaned up by the game creation process yet. Active
 * games become hibernated once the server has been closed while they are in
 * the middle of a game, if they are in the lobby, the cleanup systems will
 * just delete the game outright instead of saving it to disk. These methods
 * allow us to keep games that are in the process of being played if/when the
 * server crashes/restarts from having to completely start the game over again.
 */
export var hibernatedGames: string[] = [];
export var games: {[index: string]: Game} = {};

export const log: Logger = new Logger({
	displayDateTime: conf.log.datetime,
	displayFunctionName: false,
	displayLoggerName: true,
	displayFilePath: `hidden`,
	displayLogLevel: true,
	minLevel: conf.log.level,
	name: `GLOBAL`,
});

// log.attachTransport(new DiscordTransport, "info");

// Ensure the config valid
if (Validate.config(conf)) {

	// Add event listeners if we want to use the datastore saving game system
	if (conf.datastores.enabled) {
		log.info(`Loading list of hibernated games`);

		// Get game IDs from datastore
		hibernatedGames = readdirSync(conf.datastores.directory)
			.filter(g => g.endsWith(conf.datastores.filetype))
			.map(f => f.replace(`\.${conf.datastores.filetype}`, ``));

		log.info(`Found ${hibernatedGames.length} hibernated games`);
		process.on(`uncaughtException`, processExit);
		process.on(`SIGINT`, processExit);
		process.on(`SIGTERM`, processExit);
	};

	startWebsocket(conf);
}