package trees;

import java.io.PrintWriter;
import schoolDirectory.Entry;
import schoolDirectory.Student;
import schoolDirectory.Faculty;
import trees.TreeNode;

public class BSTree {

    private TreeNode root;

    BSTree () {
        root = null;
    }

    public void insert (Entry person) {
        if (root == null)
            root = new TreeNode(person);
        else {
            TreeNode ptr = root;  // pointer to node in search for leaf
            while (ptr != null) {// search for leaf
                if (person.comesBefore(ptr.getData())) {
                    // insert on left of given node
                    if (ptr.getLeft() == null) {
                        // when at end of tree, insert
                        ptr.setLeft(new TreeNode(person));
                        return; 
                    } else 
                        // move left in tree and continue search
                        ptr = ptr.getLeft();
                } else {
                    // insert on right of given node
                    if (ptr.getRight() == null) {
                        // when at end of tree, insert
                        ptr.setRight(new TreeNode(person));
                        return;
                    } else
                        // move right in tree and continue search
                        ptr = ptr.getRight();
                }
            }

            // insertion should be done by now!!
            // exception could be thrown or error message printed here!!
        }
    }


    public void print (PrintWriter out) {
        out.println ("Directory Listing");
        printKernel (out, root);
        out.println ();
        out.println ("End of Listing");
    }

    private void printKernel (PrintWriter out, TreeNode base) {
        // to print elements in a tree (using an in-order traversal),
        //     print the left subtree
        //     print the elements in a node
        //     print the right subtree
        if (base != null) {
            printKernel (out, base.getLeft());
            out.print(base.getData());
            printKernel (out, base.getRight());
        }
    }

    public Entry lookup (String first, String second) {
        return lookupKernel (root, first, second);
    }

    public Entry lookupKernel (TreeNode base, String first, String second) {
        if (base == null)
            return null;
        else if (base.getData().equals(first, second))
            return base.getData();
        else if (base.getData().comesBefore(first, second))
            return lookupKernel (base.getRight(), first, second);
        else return lookupKernel (base.getLeft(), first, second);
    }

    public static void main (String [] argv) {
        // test of various methods
        // constructors
        BSTree tree = new BSTree();
        PrintWriter out = new PrintWriter (System.out, true);

        Student stu1 = new Student("Terry", "Walker", "walkert@math.grin.edu",
                                   1970, "off-campus");
        Student stu2 = new Student("Barbara", "Ellen", "barbara@cs.grin.edu",
                                   2002, "12-34-56");
        Student stu3 = new Student("Donna", "Marie", "donna@math.grin.edu",
                                   1998, "3.1415926535");
        Student stu4 = new Student("Shamrock", "The Cat", "none",
                                   3000, "varies");
        Student stu5 = new Student("Muffin", "The Cat", "none",
                                   3000, "varies");

        Faculty fac1 = new Faculty("John", "Stone", "stone@math.grin.edu",
                                 "Science 2418", 3181,
                                 "Mathematics and Computer Science", 1983);
        Faculty fac2 = new Faculty("Henry", "Walker", "walker@cs.grinnell.edu",
                                 "Science 2420", 4208, 
                                 "Mathematics and Computer Science", 1973);
        Faculty fac3 = new Faculty("Janet", "Gibson", "gibson@grinnell.edu",
                                 "Science 0420", 3168,
                                 "Psychology", 1989);
        Faculty fac4 = new Faculty("Samuel", "Rebelsky","rebelsky@cs.grin.edu",
                                 "Science 2427", 4410,
                                 "Mathematics and Computer Science", 1997);

        // insert entries to directory
        tree.insert(stu1);
        tree.insert(fac1);
        tree.insert(stu2);
        tree.insert(fac2);
        tree.insert(stu3);
        tree.insert(fac3);
        tree.insert(stu4);
        tree.insert(fac4);
        tree.insert(stu5);

        // print directory
        tree.print(out);

        // check lookup
        Entry ent;
        out.println ("Searching for Barbara Ellen -- first entry");
        ent = tree.lookup("Barbara", "Ellen");
        if (ent == null)
            out.println("Barbara Ellen not found");
        else out.print(ent);

        out.println ("Searching for Terry Walker -- last entry");
        ent = tree.lookup("Terry", "Walker");
        if (ent == null)
            out.println("Terry Walker not found");
        else out.print(ent);

        out.println ("Searching for Muffin, The Cat");
        ent = tree.lookup("Muffin", "The Cat");
        if (ent == null)
            out.println("Muffin, The Cat, not found");
        else out.print(ent);

        out.println ("Searching for Muffin, The Dog");
        ent = tree.lookup("Muffin", "The Dog");
        if (ent == null)
            out.println("Muffin, The Dog, not found");
        else out.print(ent);

    }
}
