/*


*/


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


fn format_card (card1: [&str; 2]) -> String {
	format! ("{}{}", card1 [0], card1 [1])
}

/*
	Clubs
	Hearts
	Diamonds
	Spades
*/
/*
	This loops through each venue,
	with a function:
		for_each_river
*/
fn loop_through (
	for_each_venue : fn ([&str; 2], [&str; 2], Duration),
	for_each_river : fn (
		[&str; 2], [&str; 2], 
		[&str; 2], [&str; 2], 
		[&str; 2], [&str; 2], 
		[&str; 2]
	)
) {
	let venues_vector = unique_venues::retrieve_unique_venues ();
	
	for (index, pair) in venues_vector.iter ().enumerate () {
		let mut this_deck = deck::make_array ();
		let start = Instant::now ();
		
		let venue_1_team = this_deck [ pair [0] ] [1];
		let venue_1_level = this_deck [ pair [0] ] [0];
		let venue_2_team = this_deck [ pair [1] ] [1];
		let venue_2_level = this_deck [ pair [1] ] [0];
		
		let mut venue_1_card : [&str; 2] = [ "", "" ];
		match deck::remove_card (&mut this_deck, & [ venue_1_level, venue_1_team ]) {
			Some (card) => {
				venue_1_card = card;
			},
			None => println! ("Card not found")
		}

		let mut venue_2_card : [&str; 2] = [ "", "" ];
		match deck::remove_card (&mut this_deck, & [ venue_2_level, venue_2_team ]) {
			Some (card) => {
				venue_2_card = card;
			},
			None => println! ("Card not found")
		}
		

		for i1 in 0..=49 { 
			let flop_1 = this_deck [i1];
			
			for i2 in 0..=48 { 
				if (i2 == i1) { continue; }
				let flop_2 = this_deck [i2];
				
				for i3 in 0..=47 { 
					if (i3 == i1 || i3 == i2) { continue; }
					let flop_3 = this_deck [i3];
					
					for i4 in 0..=46 { 
						if (i4 == i1 || i4 == i2 || i4 == i3) { continue; }
						let turn = this_deck [i4];
						
						for i5 in 0..=45 { 
							if (i5 == i1 || i5 == i2 || i5 == i3 || i5 == i4) { continue; }
							let river = this_deck [i5];
							
							for_each_river (
								venue_1_card,
								venue_2_card,
								flop_1,
								flop_2,
								flop_3,
								turn,
								river
							);
						}
					}
				}
			}
		}
		
		let duration = start.elapsed ();
		
		for_each_venue (
			venue_1_card, 
			venue_2_card,
			duration
		);
		
		// std::mem::drop(this_deck);
	}
}



pub fn run () {
	fn loop_river (
		venue_1_card : [&str; 2],
		venue_2_card : [&str; 2],
		flop_1 : [&str; 2],
		flop_2 : [&str; 2],
		flop_3 : [&str; 2],
		turn : [&str; 2],
		river : [&str; 2]
	) {
		
	}
	
	
	
	/*
		169 Possible Hands (Essentially)
		---------------------------------
			13 Pairs
			78 Teamed
			78 Unteamed
	*/
	fn loop_venue (
		venue_1_card : [&str; 2],
		venue_2_card : [&str; 2],
		duration : Duration
	) {
		let mut name = "Venue";
		
		let venue_1_team = venue_1_card [1];
		let venue_1_level = venue_1_card [0];
		let venue_2_team = venue_2_card [1];
		let venue_2_level = venue_2_card [0];
		if (venue_1_level == venue_2_level) {
			name = "Pair"
		}
		else if (venue_1_team == venue_2_team) {
			name = "Team"
		}
		else {
			name = "Fren"
		}
		
		println! (
			"{}: {}{} {}{} {:?}", 
			name,
			venue_1_level, 
			venue_1_team,
			venue_2_level, 
			venue_2_team,
			duration
		);
	}
	
	loop_through (
		loop_venue,
		loop_river
	);
}