
package chess2;
import java.util.ArrayList;
public class DecisionTree {
    
    public static MoveNode decisionTree(ChessBoard ROOT, Side SIDE, int ply, int ceiling)
    {
        //Linking is not working. Get it to work, and this tree should be perfect.
        int key = 0;
        MoveNode decisionTree = new MoveNode(key, -1, ROOT, SIDE);
        key++;
        Side turnSide = SIDE;
        ArrayList<MoveNode> descendents = new ArrayList();
        ArrayList<MoveNode> last_generation = Reply.replies(decisionTree.board, SIDE);

         for (int i=0;i<last_generation.size();i++)
         {
             last_generation.get(i).key = key;
             last_generation.get(i).owner_key = decisionTree.key;
             descendents.add(new MoveNode(key, decisionTree.key, last_generation.get(i).board, turnSide));
             key++;
         }
        
        int generation = 1;
       
        while(generation<ply&&(descendents.size()+last_generation.size())<ceiling)
        {
           
            if (turnSide==Side.WHITE)
            {
                turnSide = Side.BLACK;
            }
            else
            {
                turnSide = Side.WHITE;
            }
           
           ArrayList <MoveNode> new_generation = new ArrayList();
           for (int j=0;j<last_generation.size()&&(descendents.size()+last_generation.size())<ceiling;j++)
           {
               ArrayList<MoveNode> offspring = Reply.replies(last_generation.get(j).board, turnSide);
               for(int k=0;k<offspring.size();k++)
               {
              
                   MoveNode tempNode = new MoveNode(key, last_generation.get(j).key, offspring.get(k).board, turnSide);
                   key++;
                   new_generation.add(tempNode);
                   descendents.add(tempNode);
                   
               }
            
           }
           last_generation.clear();
           for (int j=0;j<new_generation.size();j++)
           {
              last_generation.add(new_generation.get(j));
              
           }
           
           generation++;
        }
      
      
       int pointer = -1;
       /* int pointer = 0;
        for (int i=0;i<descendents.size();i++)
        {

            if (descendents.get(i).owner_key!=decisionTree.key)
            {
                pointer = i;
                break;
            }
            pointer++;
            decisionTree.addConsequence(descendents.get(i));
        }
        */
        
        descendents.add(0, decisionTree);
        for (int i=0;i<descendents.size();i++)
        {
           for(int j=pointer+1;j<descendents.size();j++)
           {

               if (descendents.get(j).owner_key == descendents.get(i).key)
               {
              //     System.out.println("Match found!");
                   pointer = j;
                   if (descendents.get(j).board.yourKing(Side.WHITE)!=null&&descendents.get(j).board.yourKing(Side.BLACK)!=null)
                   {
                        descendents.get(i).addConsequence(descendents.get(j));
                   }
               } 
            /*   System.out.println("Nested iteration");
               if (descendents.get(j).owner_key!=descendents.get(i).key)
               {
                   pointer = j;
                   break;
               }
               System.out.println("Something actually linked!");
               descendents.get(i).addConsequence(descendents.get(j));
              */
           }
        }
        /*
        for (int i=0;i<descendents.size();i++)
        {
            System.out.println("descendent key #"+i+" key: "+descendents.get(i).key);
        }
        
        for (int i=0;i<descendents.size();i++)
        {
            System.out.println("descendent key #"+i+" owner key: "+descendents.get(i).owner_key);
        }
         * */
     //   System.out.println("There may be a conflict: ");
     //   System.out.println("descendents.get(0) consequences: "+descendents.get(0).consequences.size());
     //   System.out.println("decisionTree consequences: "+decisionTree.consequences.size());
        
        return decisionTree;
    }
}
