
const LetterScore =
	{
		'A':1,'E':1,'I':1,'L':1,'N':1,'O':1,'R':1,'S':1,'T':1,'U':1,
		'D':2, 'G':2,
		'B':2, 'C':2, 'M':3, 'P':3,
		'F':4, 'H':4, 'V':4, 'W':4, 'Y':4,
		'K':5,
		'J':8, 'X':8,
		'Q':10, 'Z':10,
	};

function getLetterScore(text)
{
	let L = text.toUpperCase();
	return LetterScore[L] || 0;

	for (var i=0; i<Letters.length; ++i)
	{
		if (Letters[i].letter == text)
		{
			return Letters[i].score;
		}
	}
	return 0;
}

let Joker1 = 0;
let Joker2 = 0;
let Joker3 = 0;

function MediumWord(word)
{
	return (word.length >= 4);
}
function BigWord(word)
{
	return (word.length >= 6);
}
function NumVowels(str)
{
    // Define a regular expression for vowels
    const vowelRegex = /[aeiouAEIOU]/g;
    // Match the vowels in the string
    const matches = str.match(vowelRegex);
    // Return the number of matches, or 0 if there are no matches
    return matches ? matches.length : 0;
}

function Joker1_Eval(context, word)
{
	if (MediumWord(word))
	{
		context.mult += 1;
		return true;
	}
	return false;
}
function Joker2_Eval(context, word)
{
	if (NumVowels(word) != 0)
	{
		context.mult += 1;
		return true;
	}
	return false;
}

function getBaseScore(word)
{
	let score = 0;
	for (var i=0; i<word.length; ++i)
	{
		score += getLetterScore(word[i]);
	}
	return score;
}

// TODO: Animation for individual score elements is critical
// to understanding the game, the strategies and the Jokers!
function getScore(word)
{
	let context = { score:0, mult:1 };
	context.score = getBaseScore(word);
	// TESTING!
	//Joker1_Eval(context,word);
	//Joker2_Eval(context,word);
	const score = context.score * context.mult;
	return score;
}

const Wild_01 =
	{
		name: 'Colorific',
		desc: 'Play color words for 2x bonus.',
		icon: 'Rainbow',
		add: 0,
		mult: 2,
		dict: "RED|GREEN|BLUE|WHITE|GRAY|GREY|ORANGE|SILVER|YELLOW|BLACK",
	};

const Wild_02 =
	{
		name: 'Fruity',
		desc: 'Play fruit words for 3x bonus. &#x1F34E;&#x1F34C;&#x1F95D;&#x1F349;',
		icon: 'FruitBowl',
		emoji: '&#x1F34E;&#x1F34C;',
		add: 0,
		mult: 3,
		dict: "APPLE|BANANA|CHERRY|DATE|GRAPE|LEMON|LIME|MELON|ORANGE|PEAR|WATERMELON",
	};
	
const Wild_03 =
	{
		name: 'Vowels',
		desc: 'Each vowel adds 5 points. &#x1F33B;',
		icon: 'Petunia',
		emoji: '&#x1F33B;',
		add: 5,
		mult: 1,
		dict: "AEIOUY",
	};

const Wild_04 =
	{
		name: 'May Fourth',
		desc: 'Each 4-point letter is doubled.',
		add: 0,
		mult: 2,
		dict: "FHVWY",
	};

const Wild_05 =
	{
		name: 'Pirate Talk',
		desc: 'Use piratey words for 3x bonus.',
		OnWordFirstPlay: 'Highlight = +1x bonus',
		OnAllWordsPlayed: 'Achievement',
		add: 0,
		mult: 3,
		dict: "AHOY|CANNON|PIRATE|RUM|SHIP|SEA|PATCH|SAIL|PARROT",
	};

const Wild_06 =
	{
		name: 'Tick Tock',
		desc: 'Play word within 10-seconds for 2x bonus.',
		icon: 'Angry Clock',
		OnTimer10: 'Highlight = 2x bonus',
		add: 0,
		mult: 2,
	};

const Wild_07 =
	{
		name: 'Royal Flush',
		desc: 'Discard all tiles for free. (1/10)',
		icon: 'ToiletThrone',
		OnTimer10: 'Highlight = 2x bonus',
		charges: 10,
		add: 0,
		mult: 2,
	};

const Wild_08 =
	{
		name: 'A+',
		desc: 'Each (A) tile played is worth 10-points',
		icon: 'A-Plus',
		add: 10,
		ie: 'ALABAMA|DATA|AREA|GALA|BANANA'
	};

const Wild_09 =
	{
		name: 'Double Up',
		desc: 'Play vowel pairs for 3x.',
		icon: 'Two-Headed',
		add: 10,
		ie: 'TEACH|LOOK|YOU|BREAD|DEER'
	};

const Wild_10 =
	{
		name: 'Double-Up',
		desc: 'Play a single word for 1/2 the Win score',
		icon: '2-UP',
		multi: 2,
	};

	
const Wild_11 = { name: 'Wild 11', desc: 'Play specific cards.' };
const Wild_12 = { name: 'Wild 12', desc: 'Play specific cards.' };
	
const Wildcards = [ Wild_01, Wild_02, Wild_03, Wild_04, Wild_05, Wild_06, Wild_07, Wild_08 ];

function pickWildcards(count)
{
	let list = [];
	const Copy = Wildcards.slice();
	for (var i=0; i<count; ++i)
	{
		let max = Copy.length;
		if (max == 0)
		{
			break;
		}
		let j = Math.floor(Math.random()*max);
		let card = Copy[j];
		list.push(card);
		Copy.splice(j,1);
	}
	return list;
}

function selectOpponent(who)
{
	let list = document.querySelector('.master');
	list.innerHTML = '';		
	let big = createBigOpponent(who,'opponent big-op');
	list.appendChild(big);			
}

function createBigOpponent(tag,iClass)
{
	let name = tag.name;
	let emoji = tag.emoji;
	let item = document.createElement('div');
	item.className = iClass;
	item.innerHTML = `
		<div class="big-emoji">${emoji}</div>
		<div class="big-name">${name}</div>
	`;
	return item;
}

function createOpponent(tag,iClass)
{
	let name = tag.name;
	let emoji = tag.emoji;	
	let item = document.createElement('div');
	item.className = iClass;
	item.innerHTML = `
		<div class="clear-button">Select</div>
		<div class="score-text">Score: 32</div>
		<div class="large-emoji">${emoji}</div>
	`;
	
	// TODO: selectOpponent();
	item.addEventListener('click', () => { selectOpponent(tag); });
	
	const list = document.querySelector('.opponent-list');
	list.appendChild(item);
	
	return item;
}

		
let Faces =
[
	"&#128118;", // Baby
	"&#129299;", // Nerd
	"&#129312;", // Cowboy
	"&#128104;", // Man
	"&#128105;", // Woman
	"&#128570;", // Cat
	"&#128105;&#8205;&#9877;&#65039;", // Nurse
	"&#128104;&#8205;&#128187;", // Tech
	"&#129501;", // Elf
	"&#128110;", // Police
	"&#128115;", // Turban
	"&#128373;", // Detective
	"&#129332;", // Prince
	"&#129333;", // Tuxedo
	"&#129492;", // Beard
	"&#129497;", // Wizard
	"&#128113;", // Blonde
	//"&#129503;", // Zombie
];

let Bosses =
[
	"&#128125;", // Alien
	"&#128520;", // Demon
	"&#128123;", // Ghost
	"&#x1F916;", // Robot
	"&#128121;", // Goblin
	"&#129313;", // Clown
	"&#129499;", // Vampire
	"&#129465;", // Villain
	"&#128128;", // Skull
	"&#127183;", // Joker
];

// i.e. Small Blind
let Mini_01 = { score:12, name:"Baby",	emoji:"&#128118;" };
let Mini_02 = { score:12, name:"Panda",	emoji:"&#128060;" };
let Mini_03 = { score:12, name:"Kitty", emoji:"&#128570;" };
let Mini_04 = { score:12, name:"Doggy",	emoji:"&#128054;" };
let Mini_05 = { score:12, name:"Fox",   emoji:"&#129418;" };
let Mini_06 = { score:12, name:"Rabbit",emoji:"&#128048;" };
let Mini_07 = { score:12, name:"Monkey",emoji:"&#128053;" };
let Mini_08 = { score:12, name:"Mouse", emoji:"&#128045;" };

// i.e. Big Blind
let Opp_01 = { score:20, name:"Wizard", emoji:"&#129497;" };
let Opp_02 = { score:20, name:"Elf",    emoji:"&#129501;" };
let Opp_03 = { score:20, name:"Nerd",   emoji:"&#129299;" };
let Opp_04 = { score:20, name:"Cowboy", emoji:"&#129312;" };
let Opp_05 = { score:20, name:"Man",    emoji:"&#128104;" };
let Opp_06 = { score:20, name:"Woman",  emoji:"&#128105;" };
let Opp_07 = { score:20, name:"Beard",  emoji:"&#129492;" };
let Opp_08 = { score:20, name:"Blonde", emoji:"&#128113;" };
let Opp_09 = { score:20, name:"Police", emoji:"&#128110;" };
let Opp_10 = { score:20, name:"Turban", emoji:"&#128115;" };
let Opp_11 = { score:20, name:"Prince", emoji:"&#129332;" };
let Opp_12 = { score:20, name:"Tuxedo", emoji:"&#129333;" };
let Opp_13 = { score:20, name:"Detective", emoji:"&#128373;" };
let Opp_14 = { score:20, name:"Nurse",  emoji:"&#128105;&#8205;&#9877;&#65039;" };
let Opp_15 = { score:20, name:"Tech",   emoji:"&#128104;&#8205;&#128187;" };

// i.e Boss Blind
let Boss_01 = { score:40, name:"Alien Boss",  emoji:"&#128125;" };
let Boss_02 = { score:40, name:"Demon Boss",  emoji:"&#128520;" };
let Boss_03 = { score:40, name:"Ghost Boss",  emoji:"&#128123;" };
let Boss_04 = { score:40, name:"Robot Boss",  emoji:"&#x1F916;" };
let Boss_05 = { score:40, name:"Goblin Boss", emoji:"&#128121;" };
let Boss_06 = { score:40, name:"Clown Boss",  emoji:"&#129313;" };
let Boss_07 = { score:40, name:"Vampire Boss",emoji:"&#129499;" };
let Boss_08 = { score:40, name:"Villain Boss",emoji:"&#129465;" };
let Boss_09 = { score:40, name:"Skull Boss",  emoji:"&#128128;" };
let Boss_10 = { score:40, name:"Joker Boss",  emoji:"&#127183;" };

let NewSmall =
[
	Mini_01, Mini_02, Mini_03, Mini_04,
	Mini_05, Mini_06, Mini_07, Mini_08,
];

let NewFaces =
[
	Opp_01,	Opp_02,	Opp_03,	Opp_04,
	Opp_05,	Opp_06,	Opp_07,	Opp_08,
	Opp_09,	Opp_10,	Opp_11,	Opp_12,
];

let NewBosses =
[
	Boss_01, Boss_02, Boss_03, Boss_04, Boss_05,
	Boss_06, Boss_07, Boss_08, Boss_09, Boss_10,
];

let Wizard = Opp_01;
	
	for (let i=0; i<3; ++i)
	{
		let Who = (i==0) ? NewSmall : (i<2 ? NewFaces : NewBosses);
		let opp = Math.floor(Math.random()*Who.length);
		createOpponent(Who[opp],'opponent');
		Who.splice(opp,1);
	}

const shopContainer = document.querySelector('.shop-tiles');

let shopCart = [ Wild_01, Wild_02, Wild_03, Wild_04 ];
let shopWidget = null;

function PlayerHas(item)
{
	// Try to avoid duplicates?
	for (let has of PlayerWildcards)
	{
		if (has === item)
		{
			return true;
		}
	}
	return false;
}

function BuildShop(doc)
{
	shopContainer.innerHTML = '';
	for (let item of shopCart)
	{
		if (PlayerHas(item))
		{
			continue;
		}
		let widget = createWildcard(item);
		widget.addEventListener('click',()=>{toggleBuyButton(widget);});
		//widget.addEventListener('click', (function(p){
			//return function(){buyWildcard(p);}
		//})(item));
		let buy = widget.querySelector('.buyTag');
		buy.addEventListener('click',()=>{buyWildcard(item);});
		shopContainer.appendChild(widget);
	}
}

function setShopFocus(widget)
{
	if (widget !== shopWidget)
	{
		if (shopWidget !== null)
		{
			hideBuyButton(shopWidget);
			shopWidget = null;
		}
		if (widget !== null)
		{
			showBuyButton(widget);
			shopWidget = widget;
		}
	}
}

function toggleBuyButton(widget)
{
	let buy = widget.querySelector('.buyTag');
	if (buy.style.opacity > 0)
	{
		buy.style.opacity = 0;
		buy.style.visibility = 'none';
		setShopFocus(null);
	}
	else
	{
		setShopFocus(widget);
	}
}

function hideBuyButton(widget)
{
	let buy = widget.querySelector('.buyTag');
	buy.style.opacity = 0;
	buy.style.visibility = 'none';
}
function showBuyButton(widget)
{
	if (widget !== null)
	{
		let buy = widget.querySelector('.buyTag');
		buy.style.opacity = 1;
		buy.style.visibility = 'block'; // aka visible
	}
}

function buyWildcard(wild)
{
	shopCart = shopCart.filter(it => it !== wild);
	PlayerWildcards.push(wild);
	showWildcard(wild);
	BuildShop(document);
}

const canvas = document.getElementById('bg-canvas');
const ctx = canvas.getContext('2d');

function resizeCanvas()
{
	canvas.width = window.innerWidth;
	canvas.height = window.innerHeight;
}

function animate()
{
	// Example animation: moving dots
	ctx.fillStyle = 'rgba(120, 64, 120, 0.1)';
	//ctx.fillRect(0, 0, canvas.width, canvas.height);
	
	if (Math.random() < 1)
	{
		// Draw something here
		const x = Math.random() * canvas.width;
		const y = Math.random() * canvas.height;
		const r = Math.floor(Math.random() * 64);
		const g = 32;
		const b = 64;
		ctx.fillStyle = `rgba(${r},${g},${b},0.33)`;
		ctx.beginPath();
		ctx.arc(x, y, 128, 0, Math.PI * 2);
		ctx.fill();
	}
	
	requestAnimationFrame(animate);
}

window.addEventListener('resize', resizeCanvas);
resizeCanvas();
animate();
