/*
 * index.js - Pajenerator client code
 */

// State
var generating = false;
var names = [];
var flashcount = 0;
var flashinterval;

// Needed elements
let root;
let btn;
let out;

const search_front = "https://www.linkedin.com/pub/dir?firstName=";
const search_back = "&lastName=&trk=people-guest_people-search-bar_search-submit";

function onready()
{
	root = document.querySelector("html")
	btn = document.querySelector("#btn");
	out = document.querySelector("#name-box");
}

// Returns the names from the API - as many as are configured.
function get_names(onget)
{
	const error_response = Array(15).fill(["Errar", "Prablem"]).flat();
	const uri = "/api";
	let req = new XMLHttpRequest();

	req.onreadystatechange = function() {
		if (this.readyState == 4) {
			if (this.status != 200) {
				onget(error_response);
				return;
			}

			try {
				let arr = JSON.parse(this.responseText)
				onget(arr);
			} catch {
				console.log("bad json: "+this.responseText)
				onget(error_response);
			}
		}
	}

	req.open("GET", uri, true);
	req.send();
}

/*
 * 0.2x + 0.2e^(x-27)
 * where:
 * 	x - nth iteration
 *	returns - time in seconds
 */
function timeout(i)
{
	return (0.2*i) + (0.2*Math.exp(i - 27));
}

function cleanup_generate()
{
	// Reset button text (partially)
	btn.textContent = "Do the needful";
	btn.disabled = true;
	// Reset cursor
	root.classList.remove("loading");
	btn.classList.remove("loading");
	out.classList.remove("loading");

	// People with this name
	document.querySelector("#search").classList.remove("hidden");
	document.querySelector("#search").href = search_front + out.value + search_back;

	flashinterval = setInterval(() => {
		out.classList.toggle("highlight");
		if (flashcount++ >= 6) {
			flashcount = 0;
			generating = false;
			names = [];

			clearInterval(flashinterval);

			out.classList.remove("highlight");
			btn.disabled = false;
		}
	}, 500)

}

function run_generate()
{
	for (let i = 0; i < names.length; i++) {
		setTimeout(() => {
			out.value = names[i];
			if (i == names.length - 1) {
				cleanup_generate();
			}
		}, 1000*timeout(i));
	}
}

function pull_names(arr)
{
	names = names.concat(arr);
	if (names.length >= 30) {
		run_generate();
	} else {
		get_names(pull_names)
	}
}

function generate()
{
	if (generating)
		return;
	generating = true;

	// Button text
	btn.textContent = "Ok sar...!";
	// Cursors
	root.classList.add("loading");
	btn.classList.add("loading");
	out.classList.add("loading");
	// People with this name
	document.querySelector("#search").classList.add("hidden");

	get_names(pull_names);
}