package minicactpot

// import "core:fmt"

Valid_Numbers :: bit_set[1 ..= 9]

prizes := [?]int {
	0,
	0,
	0,
	0,
	0,
	0,
	10000,
	36,
	720,
	360,
	80,
	252,
	108,
	72,
	54,
	180,
	72,
	180,
	119,
	36,
	306,
	1080,
	144,
	1800,
	3600,
}

choice_pattens := [?][3]int{{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}}

solve :: proc(board: []int) -> [3]int {
	unused: Valid_Numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}
	for i in board {
		unused -= {i}
	}

	highest_weight: f32
	winning_pattern: [3]int
	for pattern in choice_pattens {
		min, max: int
		num_empty: int

		for i in pattern {
			if board[i] == 0 {
				num_empty += 1
				continue
			}
			min += board[i]
			max += board[i]
		}
		if num_empty > 0 {
			i: int
			for b in i ..= 9 {
				if b in unused {
					min += b
					i += 1
					if i == num_empty {
						break
					}
				}
			}
			i = 0
			for b in i ..= 9 {
				check := 10 - b
				if check in unused {
					max += check
					i += 1
					if i == num_empty {
						break
					}
				}
			}
		}

		num_combinations := num_empty * card(unused) if num_empty > 0 else 1
		high_win := prizes[max] if prizes[max] > prizes[min] else prizes[min]
		weight := f32(high_win) / f32(num_combinations) / f32(num_empty if num_empty > 0 else 1)
		if weight > highest_weight {
			highest_weight = weight
			winning_pattern = pattern
		}
	}

	return winning_pattern
}