// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.npc.util;

import java.util.function.Supplier;
import com.hypixel.hytale.math.random.RandomExtra;
import com.hypixel.hytale.common.thread.ticking.Tickable;

public class Timer implements Tickable
{
    private double value;
    private double minRestartValue;
    private double maxValue;
    private double rate;
    private boolean repeating;
    private TimerState state;
    private boolean initialised;
    
    public Timer() {
        this.value = 0.0;
        this.state = TimerState.STOPPED;
    }
    
    public void setRate(final double rate) {
        this.rate = rate;
    }
    
    public void setMinRestartValue(final double minRestartValue) {
        this.minRestartValue = minRestartValue;
    }
    
    public void setMaxValue(final double maxValue) {
        this.maxValue = maxValue;
    }
    
    public void setValue(final double v) {
        this.value = Math.min(v, this.maxValue);
    }
    
    public void setRepeating(final boolean repeating) {
        this.repeating = repeating;
    }
    
    public double getValue() {
        return this.value;
    }
    
    public boolean isInitialised() {
        return this.initialised;
    }
    
    @Override
    public void tick(final float dt) {
        if (this.state != TimerState.RUNNING) {
            return;
        }
        this.value -= dt * this.rate;
        if (this.value > 0.0) {
            return;
        }
        if (this.repeating) {
            final double offset = this.value;
            this.restart();
            this.value -= offset;
            return;
        }
        this.state = TimerState.STOPPED;
        this.value = 0.0;
    }
    
    public void start(final double minStartValue, final double maxStartValue, final double minRestartValue, final double maxValue, final double rate, final boolean repeating) {
        this.value = RandomExtra.randomRange(minStartValue, maxStartValue);
        this.minRestartValue = minRestartValue;
        this.maxValue = maxValue;
        this.rate = rate;
        this.repeating = repeating;
        this.state = TimerState.RUNNING;
        this.initialised = true;
    }
    
    public void resume() {
        if (this.isPaused()) {
            this.state = TimerState.RUNNING;
        }
    }
    
    public void pause() {
        if (this.isRunning()) {
            this.state = TimerState.PAUSED;
        }
    }
    
    public void addValue(final double v) {
        this.value = Math.min(this.value + v, this.maxValue);
    }
    
    public void stop() {
        this.state = TimerState.STOPPED;
    }
    
    public void restart() {
        this.value = this.pickNextTimerValue();
        this.state = TimerState.RUNNING;
    }
    
    public boolean isInState(final TimerState s) {
        return s == TimerState.ANY || this.state == s;
    }
    
    public boolean isPaused() {
        return this.state == TimerState.PAUSED;
    }
    
    public boolean isRunning() {
        return this.state == TimerState.RUNNING;
    }
    
    public boolean isStopped() {
        return this.state == TimerState.STOPPED;
    }
    
    private double pickNextTimerValue() {
        return RandomExtra.randomRange(this.minRestartValue, this.maxValue);
    }
    
    public enum TimerAction implements Supplier<String>
    {
        START("Start"), 
        STOP("Stop"), 
        PAUSE("Pause"), 
        CONTINUE("Continue"), 
        RESTART("Restart"), 
        MODIFY("Modify");
        
        private final String asText;
        
        private TimerAction(final String text) {
            this.asText = text;
        }
        
        public String asText() {
            return this.asText;
        }
        
        @Override
        public String get() {
            return this.asText;
        }
    }
    
    public enum TimerState implements Supplier<String>
    {
        RUNNING("Running"), 
        PAUSED("Paused"), 
        STOPPED("Stopped"), 
        ANY("Any");
        
        private final String asText;
        
        private TimerState(final String text) {
            this.asText = text;
        }
        
        public String asText() {
            return this.asText;
        }
        
        @Override
        public String get() {
            return this.asText;
        }
    }
}
