from menu import *
from entry_list import *
from entry import *
from analysis_board import *
from random import *
from time import time

def rnd(i = 1): return randint(0,i)

class Bot():
	def __init__(self, name, entry, plr_list=None):
		self.color_int = 7
		self.is_machine = True
		self.name = name
		# bots go at the end of the list
		self.plr_list = plr_list
		self.alg_1 = self.no_alg
		self.alg_2 = self.no_alg
		self.alg_3 = self.no_alg
		self.alg_4 = self.no_alg
		self.alg_5 = self.no_alg
		# initialize a menu and set it to self.menu
		self.param_alg_1 = Param('1st Algorithm', self.alg_name_list, setr_meth=self.set_alg_1)
		self.param_alg_2 = Param('2nd Algorithm', self.alg_name_list, setr_meth=self.set_alg_2)
		self.param_alg_3 = Param('3rd Algorithm', self.alg_name_list, setr_meth=self.set_alg_3)
		self.param_alg_4 = Param('4th Algorithm', self.alg_name_list, setr_meth=self.set_alg_4)
		self.param_alg_5 = Param('5th Algorithm', self.alg_name_list, setr_meth=self.set_alg_5)
		self.param_alg_1.item = self.alg_1.__name__
		self.param_alg_2.item = self.alg_2.__name__
		self.param_alg_3.item = self.alg_3.__name__
		self.param_alg_4.item = self.alg_4.__name__
		self.param_alg_5.item = self.alg_5.__name__
		self.entries = EntryList([self.param_alg_1, self.param_alg_2, self.param_alg_3, self.param_alg_4, self.param_alg_5])
		self.prompt = f"Edit {self.name}'s Settings"
		self.menu = Menu(self.prompt, self.entries)
		self.entry = entry
		entry.text = name
		entry.item = self.menu
		self.board = AnalysisBoard()
	
	@property
	def text_color(self):
		if self.color_int > 0 and self.color_int <=7:
			return f'\033[9{self.color_int}m'

	@property
	def indicate_color(self):
		if self.color_int > 0 and self.color_int <=7:
			return f'\033[10{self.color_int}m\033[30m'

	def set_alg_1(self, alg_name): self.alg_1 = self.alg_list[self.alg_name_list.index(alg_name)]
	def set_alg_2(self, alg_name): self.alg_2 = self.alg_list[self.alg_name_list.index(alg_name)]
	def set_alg_3(self, alg_name): self.alg_3 = self.alg_list[self.alg_name_list.index(alg_name)]
	def set_alg_4(self, alg_name): self.alg_4 = self.alg_list[self.alg_name_list.index(alg_name)]
	def set_alg_5(self, alg_name): self.alg_5 = self.alg_list[self.alg_name_list.index(alg_name)]
		
	@property
	def alg_list(self):
		lst = []
		for att in dir(self):
			if len(att) >= 5:
				if att[-4:] == '_alg' or att[:5] == 'rand_':
					lst.append(getattr(self, att)) 
		return lst

	@property
	def alg_name_list(self):
		lst = []
		for alg in self.alg_list:
			lst.append(alg.__name__)
		return lst

	def rand_fr(self): return choice('abc') + choice('123')

	def rand_sqr(self): return choice(['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3'])

	def rand_lgl(self): return choice(self.board.legal_moves)

	def no_alg(self): return ''

	def tiar_alg(self):
		sqr_nm = ''
		row_names = self.board.row_names
		shuffle(row_names)
		for row_name in row_names:
			if self.board.row_dict[row_name].count(self.board.turn) == 2 and self.board.row_dict[row_name].count(' ') == 1: 
				pos = self.board.row_dict[row_name].index(' ')
				sqr_nms = self.board.__getattribute__(f'row_{row_name}_sqr_nms')
				sqr_nm = sqr_nms[pos]

		return sqr_nm

	def block_alg(self):
		sqr_nm = ''
		row_names = self.board.row_names
		shuffle(row_names)
		for row_name in row_names:
			if self.board.row_dict[row_name].count(self.board.alt_turn) == 2 and self.board.row_dict[row_name].count(' ') == 1: 
				pos = self.board.row_dict[row_name].index(' ')
				sqr_nms = self.board.__getattribute__(f'row_{row_name}_sqr_nms')
				sqr_nm = sqr_nms[pos]

		return sqr_nm
	
	def build_alg(self):
		sqr_nm = ''
		row_names = self.board.row_names
		shuffle(row_names)
		for row_name in row_names:
			if self.board.row_dict[row_name].count(self.board.turn) == 1 and self.board.row_dict[row_name].count(' ') == 2: 
				rng_ind = [0, 1, 2]
				pos = self.board.row_dict[row_name].index(self.board.turn)
				rng_ind.remove(pos)
				sqr_nms = self.board.__getattribute__(f'row_{row_name}_sqr_nms')
				sqr_nm = sqr_nms[rng_ind[rnd()]]

		return sqr_nm

	def fork_alg(self):
		sqr_nm = ''
		sn = self.board.all_sqr_nms
		shuffle(sn)
		for s in sn:
			if self.board.all_sqrs_dict[s] == self.board.turn:
				s_2 = ''
				for s_0 in sn:
					if s_0 != s and self.board.all_sqrs_dict[s_0] == self.board.turn: s_2 = s_0
				if s_2 != '':
					rows_s_1 = self.board.sqr_rows[s]
					rows_s_2 = self.board.sqr_rows[s_2]
					for q in sn:
						if self.board.all_sqrs_dict[q] == ' ':
							row_q_1 = ''
							row_q_2 = ''
							for row_q in self.board.sqr_rows[q]:
								if row_q in rows_s_1 and self.board.row_dict[row_q].count(' ') == 2 and self.board.row_dict[row_q].count(self.board.turn) == 1:
									row_q_1 = row_q
								if row_q in rows_s_2 and self.board.row_dict[row_q].count(' ') == 2 and self.board.row_dict[row_q].count(self.board.turn) == 1:
									row_q_2 = row_q
							pass
							if row_q_1 != '' and row_q_2 != '':
								sqr_nm = q

		return sqr_nm

	def move(self, fen_board):
		sqr_nm = ''
		self.board.fen_board = fen_board
		if sqr_nm == '': sqr_nm = self.alg_1()
		if sqr_nm == '': sqr_nm = self.alg_2()
		if sqr_nm == '': sqr_nm = self.alg_3()
		if sqr_nm == '': sqr_nm = self.alg_4()
		if sqr_nm == '': sqr_nm = self.alg_5()
		self.board.fen_board = '3/3/3'
		return sqr_nm