import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Color;
import java.awt.Font;

/**
 * Die Klasse Uhr simuliert eine Uhr mithilfe der FPS.
 * 
 * @author Marek Parucha
 * @version 2.0_25.03.2014
 */
public class Clock extends Actor
{
    private int startingTime; //Startzeit
    private int currentFrame = 0; // jetziger Frame
    private int seconds = 180; // jetziger sekunden stand
    
    private int lastCurrentFrame; //letzter gespeicherster Frame
    private long frameSaved = 0; // gespeicherter Frame
    
    private boolean timeUp = false; // falls true --> Countdown der Uhr abgelaufen
    private boolean count = false; //falls true --> Uhr läuft noch
    private boolean displayTime; //falls true --> Uhr wird visualisiert
    private boolean countDown; // falls true --> Uhr läuft runter
    
    private String text; //anzuzeigender Text falls 'displayTime' == true
    
    /**
     * Kreiert eine neue 'Clock'
     * 
     * @param 'countDown':
     *      Falls true-->zählt die Uhr runter
     * 
     * @param displayTime
     *      Falls true --> Zeit wird visualisiert
     * 
     * @param startingTime
     *      Die Zeit bei der Der Countdown starten soll fals 'countDown' == true
     * 
     * @param text
     *      Text der über der Uhr angezeigt werden soll
     */
    public Clock(boolean countDown, boolean displayTime, int startingTime, String text) 
    {
        this.countDown = countDown;
        this.displayTime = displayTime;
        this.startingTime = startingTime;
        this.text = text;
        seconds = startingTime;
        getImage().clear();
        if (!countDown) 
        {
            seconds = 0;
        }
        if (displayTime) 
        {
            getImage().scale(130, 70);
        }
        this.startClock();
    }
    
    
    
    /**
     * Die act() Methode der Klasse 'Clock'
     * Lässt die Uhr zählen. Um die Uhr zu pausieren muss 'stopClock()' ausgeführt werden oder ((TeD_World)getWorld()).pauseGame == false.
     * Diese Uhr ist Frame abhängig --> je höher FPS desto schneller läuft die Uhr.
     */
    public void act() 
    {
        
        currentFrame++;
        lastCurrentFrame++;
        if (displayTime) 
        {
                        drawTime();
        }
        if (countDown) 
        {
            if (count && !timeUp) 
            {
                if (currentFrame==29) 
                {
                    
                    seconds--;
                    currentFrame = 0;
                    if (displayTime) 
                    {
                        drawTime();
                    }
                }
                if (seconds == 0) 
                {
                   
                    timeUp = true;
                }
            }
        }
        else 
        {
            if (count) 
            {
                if (currentFrame== 29) 
                {
                    
                    seconds++;
                    currentFrame = 0;
                }
            }
        }
    }
   
    
    
    /**
     * Zeichnet die Uhr bzw. Uhrzeit
     */
   
    private void drawTime() 
    {
        int min = (int) (seconds / 60);
        int sec = seconds % 60;
        String remainingTime;
        if (sec < 10) 
        {
            remainingTime = min + ":0" + sec;
        }
        else 
        {
            remainingTime = min + ":" + sec;
        }
        getImage().setColor(Color.gray);
        getImage().fill();
        GreenfootImage text = new GreenfootImage((this.text == null ? "" : this.text), 30, Color.black, new Color(0, 0, 0, 0));
        GreenfootImage time = new GreenfootImage(remainingTime, 40, Color.black, new Color(0, 0, 0, 0));
        if (text.getWidth() > getImage().getWidth()) 
        {
            getImage().clear();
            getImage().scale(text.getWidth() + 10, 70);
            getImage().setColor(Color.gray);
            getImage().fill();
        }
        getImage().drawImage(text, (getImage().getWidth()/2)-(text.getWidth()/2), 5);
        getImage().drawImage(time, (getImage().getWidth()/2)-(time.getWidth()/2), (this.text == null ? (getImage().getHeight()/2)-(time.getHeight()/2) : 30));
    }
    
    /**
     * Überprüft ob der Countdown abgelaufen ist
     * 
     * @return gibt true aus falls die Zeit abgelaufen ist
     */
    public boolean timeUp() 
    {
        return timeUp;
    }
    
    /**
     * Startet die Uhr.
     */
    public void startClock() {
        lastCurrentFrame = currentFrame - (int)frameSaved;
        count = true;
    }
    /**
     * Pausiert die Uhr.
     */
    public void stopClock() 
    {
        frameSaved = currentFrame - lastCurrentFrame;
        count = false;
    }
    
    /**
     * Resetet die Uhr.
     */
    public void setClock() 
    {
        timeUp = false;
        seconds = 0;
        currentFrame = 0;
        lastCurrentFrame = 0;
        
        
        
    }
    public void resetClock() 
    {
        timeUp = false;
        seconds = startingTime;
        currentFrame = 0;
        lastCurrentFrame = 0;
        
        
        
    }
    
    /**
     * gibt die Frame Zahl aus
     * @return letzte gemessene Frame zahl 'lastCurrentFrame'
     */
    public int getFrames()
    {
        return lastCurrentFrame;
    }
    /**
     * gibt die Sekunden aus die vergangen sind
     * @return derzeitiger Sekunden stand
     */
    public int getSeconds()
    {
        return seconds;
    }
}

