# -*- coding: utf-8 -*-

import copy

class Largura:

    def __init__(self, root,estadoFinal): 
        self.listaDeNodes = [] # iniciliza a lista de nodes
        self.listaDeNodes.append(root) # pega a lista de nodes e adiciona o raiz na lista 
        self.estadoFinal = estadoFinal #  pega o valor da global e armazena na variavel local
        self.visitList = [] # guarda os nos visitados 
        self.teste_lista() # chama a funcao teste 
        
    def teste_lista(self):
        arq = open('output_Largura.txt','w')
        arq.write("Busca em Largura\n")        
        while(True):
            elementoAtual = self.listaDeNodes.pop(0) # coloca o primeiro elemento da fila na variavel elemento atual
            self.visitList.append(elementoAtual.statePuzzle.nullPosition) # coloca o elemento atual na lista de elementos
            print(elementoAtual.statePuzzle.mat) # imprimi o elemento atual 
            

            #vamos gravar as saidas no arquivo
            if elementoAtual.generateFrom == 0:
                arq.writelines(str(elementoAtual.statePuzzle.mat) + " generate_from: move_up custo: " + str(elementoAtual.custo) + " profundidade: " + str(elementoAtual.profundidade) + "\n")
            elif elementoAtual.generateFrom == 1:
                arq.writelines(str(elementoAtual.statePuzzle.mat) + " generate_from: move_down custo: " + str(elementoAtual.custo) + " profundidade: " + str(elementoAtual.profundidade) + "\n")   
            elif elementoAtual.generateFrom == 2:
                arq.writelines(str(elementoAtual.statePuzzle.mat) + " generate_from: move_right custo: " + str(elementoAtual.custo) + " profundidade: " + str(elementoAtual.profundidade) + "\n")    
            elif elementoAtual.generateFrom == 3:
                arq.writelines(str(elementoAtual.statePuzzle.mat) + " generate_from: move_left custo: " + str(elementoAtual.custo) + " profundidade: " + str(elementoAtual.profundidade) + "\n")
            else:
                arq.write(str(elementoAtual.statePuzzle.mat) + " generate_from: root\n")
               
            if not elementoAtual.statePuzzle.compare(self.estadoFinal):
                #o elementoAtual possui o estado final!!
                arq.write("Estado final encontrado!!!\nCusto = " + str(elementoAtual.custo) + "\nProfundidade = " + str(elementoAtual.profundidade)) 
                print("O elementoAtual possui o estado final!!\n")
                result = []
                result.append(elementoAtual)
                result.append(self.listaDeNodes)
                return result
            else:
                #o elementoAtual nao é o estado final devemos expandir seus filhos
                #os nós criados sáo adicionas a listadeNodes dentro da funcao
                elementoAtual.set_filhos(self.listaDeNodes,self.visitList)
                arq.write("Número de nós da fronteira: " + str(len(self.listaDeNodes)) + " ")
        arq.close()
    
        
      



