/*
	Pairs: 13
		Six Each:
			2C 2S
			2C 2D
			2C 2H
			
			2S 2D
			2S 2H
			
			2D 2H
	
	On Suit: 78
		12 + 11 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1
	
		Four Each:
			2C 3C
			2S 3S
			2H 3H
			2H 3H
	
	Off Suit:  78  
		? Twelve Each:

*/



use super::deck;
use std::time::{Duration, Instant};


/*
	This builds a list of unique venues
	with their frequencies.
	
		Pair
		Team
		Fren
*/
pub fn retrieve_unique_venues () -> Vec<[usize; 3]> {
	let mut this_deck = deck::make_array ();
	let mut venues_vector : Vec<[usize; 3]> = Vec::new();
	

	let suits = ["C", "S", "H", "D"];
	let ranks = ["A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2"];
	
	
	let index = deck::retrieve_card_index (& this_deck, "7", "C");
	
	/*
		Get Pair Indexes
	*/
	let mut pairs_count = 0;
    for &rank in &ranks {
		let i1 = deck::retrieve_card_index (& this_deck, rank, "C");
		let i2 = deck::retrieve_card_index (& this_deck, rank, "D");
		venues_vector.push ([ i1, i2, 6 ]);
		pairs_count += 1
    }
    println! ("Pairs: {}", pairs_count);
	
	
	/*
		Get Suited Indexes
	*/
	let mut team_cards_count = 0;
    for i in 0..ranks.len () {
        for j in (i + 1)..ranks.len () {
			let rank1 = ranks [j]; // smaller rank
            let rank2 = ranks [i]; // bigger rank
			
			let i1 = deck::retrieve_card_index (& this_deck, rank1, "C");
			let i2 = deck::retrieve_card_index (& this_deck, rank2, "C");
			venues_vector.push ([ i1, i2, 4 ]);
			
			team_cards_count += 1;
        }
    }	
	println!("\nTeam Cards Count: {}", team_cards_count);
	

	let mut fren_cards_count = 0;
	for i in 0..ranks.len () {
        for j in (i + 1)..ranks.len () {
			let rank1 = ranks [j]; // smaller rank
            let rank2 = ranks [i]; // bigger rank
			
			let i1 = deck::retrieve_card_index (& this_deck, rank1, "C");
			let i3 = deck::retrieve_card_index (& this_deck, rank2, "D");
			venues_vector.push ([ i1, i3, 12 ]);
			
			fren_cards_count += 1;
        }
    }
	println!("\nFren Cards Count: {}", fren_cards_count);

	/*
	show_venues_vector (
		& this_deck, 
		& venues_vector
	);
	*/

	assert_eq! (venues_vector.len (), 169);	

	return venues_vector;
}



fn format_hand(card1: (&str, &str), card2: (&str, &str)) -> String {
	format! ("{}{} {}{}", card1.0, card1.1, card2.0, card2.1)
}

fn format_pair(rank: &str) -> String {
	format! ("{}{}", rank, rank)
}

fn format_unpaired(rank1: &str, rank2: &str, suited: bool) -> String {
	if suited {
		format!("{}{} suited", rank1, rank2)
	} 
	else {
		format!("{}{} unsuited", rank1, rank2)
	}
}

fn show_venues_vector (
	deck : & Vec<[&str; 2]>,
	venues_vector : & Vec<[usize; 3]>
) {
	for (index, pair) in venues_vector.iter ().enumerate () {
		let mut name = "Venue";
		
		let team_1 = deck [ pair [0] ] [1];
		let team_2 = deck [ pair [1] ] [1];
		let level_1 = deck [ pair [0] ] [0];
		let level_2 = deck [ pair [1] ] [0];
		if (level_1 == level_2) {
			name = "Pair"
		}
		else if (team_1 == team_2) {
			name = "Team"
		}
		else {
			name = "Fren"
		}
		
		
		println! (
			"{} {}: {}{} {}{} *{}", 
			name,			
			index, 
			
			deck [ pair [0] ] [0], 
			deck [ pair [0] ] [1],
			
			deck [ pair [1] ] [0],
			deck [ pair [1] ] [1],
			
			pair [2]
		);
	}
}