import { io, Socket } from 'socket.io-client';
import * as fs from 'fs';

export async function load() {
	const promise = getJwt();

	return {
		promise
	};
}

async function getJwt(): Promise<string> {
	const socket = io('https://status.neshweb.net/');
	const credFile = './credentials.json';
	let token = '';
	let valid = false;

	if (fs.existsSync(credFile)) {
		const content = fs.readFileSync(credFile);
		token = content.toString();
	}

	socket.on('connect', async () => {
		if (token == '') {
			token = await login(socket);
			valid = true;
		} else {
			socket.emit('loginByToken', token, async (res) => {
				if (!res.ok) {
					token = await login(socket);
				}
				valid = true;
			});
		}
	});

	while (!valid) {
		await new Promise((resolve) => setTimeout(resolve, 10));
	}

	fs.writeFileSync(credFile, token);

	return token;
}

async function login(socket: Socket): Promise<string> {
	let token = '';
	socket.emit(
		'login',
		{ username: process.env.KUMA_USERNAME, password: process.env.KUMA_PASSWORD, token: '' },
		(res: { token: string }) => {
			token = res.token;
			socket.close();
		}
	);

	while (token == '') {
		await new Promise((resolve) => setTimeout(resolve, 10));
	}

	return token;
}