package com.brackeen.javagamebook.scripting;

import java.util.*;

/**
    Zarządza kolejka obiektów GameTask.
*/
public class GameTaskManager {

    private List tasks;


    /**
        Tworzy nowy obiekt GameTaskManager z pustą kolejką zadań.
    */
    public GameTaskManager() {
        tasks = new ArrayList();
    }


    /**
        Dodaje zadanie do kolejki, które wykonuje określony obiekt
        runnable po zadanym czasie opóźnienia.
    */
    public void addTask(long delay, Runnable runnable) {
        addTask(new GameTask(delay, runnable));
    }

    /**
        Dodaje zadanie do kolejki.
    */
    public void addTask(GameTask task) {
        tasks.add(task);
    }

    /**
        Czyści kolejkę zadań.
    */
    public void clear() {
        tasks.clear();
    }

    /**
        Aktualizuje tego zarządce, uruchamiając wszystkie gotowe zadania.
    */
    public void update(long elapsedTime) {

        List removeList = null;
        int size = tasks.size();

        // pamiętaj, że wykonanie zadania może potencjalnie spowodować dodanie
        // nowych zadań do kolejki.
        for (int i=0; i<size; i++) {
            GameTask task = (GameTask)tasks.get(i);
            if (task.check(elapsedTime)) {
                // dodanie obiektu do listy obiektów do późniejszego usunięcia
                if (removeList == null) {
                    removeList = new ArrayList();
                }
                removeList.add(task);
            }
        }
        // usuwanie wykonanych zadań
        if (removeList != null) {
            tasks.removeAll(removeList);
        }
    }
}
