// deno
import { DOMParser } from 'https://deno.land/x/deno_dom/deno-dom-wasm.ts'

function getdompareser(html)
{
	const parser = new DOMParser();
	return parser.parseFromString(html, "text/html");
}

function getcategory(doc, category, notes)
{
	const result = [];
	const items = [...doc.getElementById(category).nextSibling.nextSibling.nextSibling.firstChild.children[0].children];
	const header = [...items.shift().children].map(h => h.textContent);
	items.forEach(elt => {
		const item = {};
		const columns = [...elt.children];
		header.forEach( (h,i) =>
		{
			item[h] = columns[i].textContent;
		});
		item.Notes = ""
		if (item.Name)
		{
			const sup = parseInt(item.Name.split(" ").pop());
			if (!isNaN(sup))
			{
				item.Notes = notes[sup - 1];
				item.Name = item.Name.substr(0, item.Name.length - 2)
			}
		}
		result.push(item);
	});
	return result;
}

function getnotes(doc)
{
	return []
	const lastsup = [...doc.getElementsByTagName("sup")].pop();
	return lastsup.parentElement.textContent.split("\n")
	.filter(i => i.length)
	.map(i => i.substr(3));
}

async function getpage(url, tables)
{
	const result = {}
	const response = await fetch(root + url)
	const html = await response.text()

	const doc = getdompareser(html);
	const notes = getnotes(doc);
	
	tables.forEach(category =>
	{
		result[category] = getcategory(doc, category, notes);
	});
	return result
}

function output(equipment)
{
	const result = []
	const exclude = ["Found", "Sold", "Available", "Ft","Mr","Go"] // add unused classes/jobs

	// todo: fix footer notes
	// todo: invert available X mark
	// todo: remove a column if always empty

	Object.keys(equipment).forEach(table => {
		const columnsizes = {}
		result.push(table.toUpperCase())
		const items = equipment[table]

		// exclude
		items.forEach(item => {
			exclude.forEach(name => {
				delete item[name]
			})
		})

		// init sizes
		items.forEach(item =>
		{
			Object.keys(item).forEach(columnname => {
				columnsizes[columnname] = columnsizes[columnname] || columnname.length
				columnsizes[columnname] = Math.max(columnsizes[columnname], (item[columnname] || "").length)
			})
		})
		
		// header
		let line = ""
		Object.keys(columnsizes).forEach(columnname => {
			const size = columnsizes[columnname]
			line += columnname + " ".repeat((Math.max(0, size - columnname.length))) + "|"
		})
		result.push(line)

		// lines
		items.forEach(item => {
			let line = ""
			Object.keys(columnsizes).forEach(columnname => {
				const size = columnsizes[columnname]
				const value = (item[columnname] || "").replace("\n", " ")
				line += value + " ".repeat(Math.max(0, size - value.length)) + "|"
			})
			result.push(line)
		})
		result.push(" ")
	})

	console.log(result.join("\n"))
}

const root = "https://mikesrpgcenter.com"
let equipment = {};

const dq3pages = [
	{
		url: "/dw3/armor.html",
		tables: ["armor", "shields", "helmets"]
	},
	{
		url: "/dw3/weapons.html",
		tables: ["weapons"]
	}
]

const ff1pages = [
	{
		url: "/ffantasy/weapons.html",
		tables: ["swords", "axes", "daggers", "staffs", "hammers", "nunchucks", "miscellaneous"]
	},
	{
		url: "/ffantasy/armor.html",
		tables: ["armor", "braceletes", "shields", "helmets", "gauntlets"]
	},
	{
		url: "/ffantasy/blackmagic.html",
		tables: ["black_magic"]
	},
	{
		url: "/ffantasy/whitemagic.html",
		tables: ["white_magic"]
	}
]

const pages = ff1pages
for (const index in pages)
{
	const page = pages[index]
	equipment = {...equipment, ...(await getpage(page.url, page.tables))}

}

output(equipment)