// POKERSCORING.JS
// Funzione per determinare il tipo di punteggio di una mano di poker
// ed array che ne associa il valore in "punti"
// Una carta si indica con l'iniziale del seme seguita dal valore es. "c5" = 5 di cuori
// ------------------------------------------------------------------------------------
// dipende da: arrayutility.js

// Punteggi:
// (0) Niente
// (1) Royal Flush		Scala Reale Massima	100
// (2) Straight Flush	Scala Reale		75
// (3) Four of a Kind	Poker			50
// (4) Full House		Full			25
// (5) Flush			Colore			20
// (6) Straight			Scala			15
// (7) Three of a Kind	Tris			10
// (8) Two Pair			Doppia Coppia	5
// (9) One Pair			Coppia			2

var scoreNames =['NULL','RoyalFlush','StraightFlush','FourOfAKind','FullHouse','Flush','Straight','ThreeOfAKind','TwoPair','OnePair'];
var scoreValues=[0,100,75,50,25,20,15,10,5,2];

// dato l'array "hand" di cinque carte da poker restituisce il tipo di
// punteggio, secondo la tabella qui sopra (i numeretti tra parentesi)
function getScoreType(hand)
{
	// occorrenze dei 13 valori possibili
	var sameRank=[0,0,0,0,0,0,0,0,0,0,0,0,0];

	// occorrenze dei 4 semi possibili
	var sameSeed=[0,0,0,0];

	// valori (numerici) delle carte della mano
	var ranks=[];

	// inizializzo i vettori di cui sopra
	k = 0;
	for (card in hand)
	{
		rank = getRank(hand[card])-1; // l'array parte da zero
		seed = getSeed(hand[card]);   // quindi sottraggo 1 dal valore
		sameRank[rank]++;
		sameSeed[seed]++;
		ranks[k]=rank+1;
		k++;
	}

	straight = 0; // tipo di scala: 1=normale, 2=massima, 0=niente
	if (count(sameRank) == 5)  // 5 carte diverse (implicitamente ogni occorrenza = 1)
	{
		distance = getMax(ranks) - getMin(ranks) // distanza tra gli estremi dei valori delle 5 carte
		if (distance == 4)
			straight=1;
                else if ( (distance==12) && (sameRank[9]==1) && (sameRank[10]==1) && (sameRank[11]==1) && (sameRank[12]==1) )
			straight=2;
	}

	if (getMax(sameSeed) == 5) 	// se ho 5 carte dello stesso seme...
	{
		if (straight)
		{
			if (straight == 2)
				return 1;		// Royal Flush (scala reale massima)
			return 2;			// Straight Flush (scala reale)
		}
		return 5;				// Flush (colore)
	}

	if (straight)			// ovvero: se e' scala, ma non e' colore...
		return 6; 				// Straight (scala)

	if (getMax(sameRank) >= 2)	// se ho una carta che occorre due o piu' volte...
	{
		sameRank.sort(ordineNumeri) // ordina 
		lastButOne = sameRank[11];	// penultimo elemento
		last = sameRank[12];		// ultimo elemento
		if (last == 4)
			return 3;	// Four of a Kind (poker)
		if (last == 3)
		{
			if (lastButOne == 2)
				return 4;	// Full House (full)
			return 7;		// Three of a Kind (tris)
		}
		if (lastButOne == 2)
			return 8;		// Two Pairs (doppia coppia)
		return 9;			// One Pair (coppia)
	}
	return 0;
}

// restituisce il seme della carta passata. Es: getSeed("c11") = "3":
// (picche="0", fiori="1", quadri="2", cuori="3")
function getSeed(card)
{
	seed = card.charAt(0);		// carattere con indice di "card"
	return "pfqc".indexOf(seed);	// indice di "seed" all'interno di "pfqc"
}

// restituisce il valore della carta passata. Es: getRank("c11")=11
function getRank(card)
{
	return parseInt(card.substr(1)); // preleva dal carattere n.1 in poi
}
