import java.util.ArrayList;

public class FibThread extends Thread {
    private int max;
    private boolean stillGoing;
    private ArrayList<FibListener> observers;
    
    public FibThread(int value) {
        max = value;
        stillGoing = false;
        observers = new ArrayList<FibListener>();
    }
    
    public void addFibListener(FibListener observer) {
        observers.add(observer);
    }
    
    public void run() {
        stillGoing = true;
        for (int i = 0; stillGoing && i <= max; ++i) {
            int f = computeFib(i);
            if (stillGoing) {
                for (FibListener observer: observers) {
                    observer.nextFibTerm(f);
                }
            }
        }
        stillGoing = false;
        for (FibListener observer: observers) {
            observer.finished();
        }
    }
    
    public void endComputation() {stillGoing = false;}
    
    public boolean isFinished() {return !stillGoing;}
    
    private int computeFib(int f) {
        if (stillGoing) {
            if (f < 2) {return 1;}
            else {
                return computeFib(f - 1) + computeFib(f - 2);
            }
        } else {
            return 0;
        }
    }
}
