/
codebase/src/net/sourceforge/pain/admin/console/command/
codebase/src/net/sourceforge/pain/data/role/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/util/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
mudlibs/tinylib/
mudlibs/tinylib/area/
mudlibs/tinylib/etc/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/prototype/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/deploy/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/fn/util/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/impl/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/command/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/reset/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/shutdown/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/social/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/util/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.tinylib.plugin.shutdown;

import net.sourceforge.pain.*;
import net.sourceforge.pain.plugin.*;
import net.sourceforge.pain.util.*;

/**
 * PAiN  Date: 20.05.2003  Time: 0:48:58
 */
public final class ShutdownTimer extends Plugin implements PulseListener {


    // in seconds
    private final int[] shutdownWarningTime = new int[]{60 * 60, 30 * 60, 20 * 60, 10 * 60, 5 * 60, 2 * 60, 60, 30, 5};
    private int[] pulseWarningTimes;
    private int pos;
    private int shutdownPulseTime;

    public ShutdownTimer() {
    }

    protected void init() throws Exception {
        pulseWarningTimes = new int[shutdownWarningTime.length];
        shutdownPulseTime = 0;
    }

    public void reset(int secondsTillShutdown, boolean broadcast) {
        boolean warRunned = isShutdownInProcess();
        Log.debug("reset:" + secondsTillShutdown + " broadcast:" + broadcast);
        pos = 0;
        final int currentTime = Codebase.getPulse().currentTime();
        shutdownPulseTime = currentTime + secondsTillShutdown * Pulse.PULSE_PER_SCD;
        for (int i = 0; i < shutdownWarningTime.length; i++) {
            int secondsTillWarn = shutdownWarningTime[i];
            pulseWarningTimes[i] = shutdownPulseTime - secondsTillWarn * net.sourceforge.pain.Pulse.PULSE_PER_SCD;
            if (pulseWarningTimes[i] < currentTime || (broadcast && pulseWarningTimes[i] == currentTime)) { // skip this warn
                pos = i + 1;
            }
        }
        if (!warRunned) {
            Codebase.getPulse().addListener(this);
        }
        if (broadcast) {
            event(secondsTillShutdown);
        }
    }

    protected void deinit() {
        cancel(true);
    }

    public void cancel(boolean broadcast) {
        if (broadcast) {
            event(-1);
        }
        Codebase.getPulse().removeListener(this);
        shutdownPulseTime = 0;
    }

    private void event(int seconds) {
        Log.debug("Shutdown in " + seconds + " seconds");
        try {
            Codebase.processEvent("ShutdownWarn", new Integer(seconds));
        } catch (Exception e) {
            Log.error(e);
        }
    }

    public void pulse(int time) {
        if (pos < shutdownWarningTime.length) {
            if (time < pulseWarningTimes[pos]) {
                return;
            }
            event(shutdownWarningTime[pos]);
            pos++;
        } else if (time >= shutdownPulseTime) {
            event(0);
            Codebase.shutdown();
        }
    }

    public void now() {
        if (!isShutdownInProcess()) {
            reset(0, false);
        }
        pos = shutdownWarningTime.length;
        shutdownPulseTime = Codebase.getPulse().currentTime();
    }

    public boolean isShutdownInProcess() {
        return shutdownPulseTime != 0;
    }

    public int getTimeBeforeShutdown() {
        if (!isShutdownInProcess()) {
            return -1;
        }
        return (shutdownPulseTime - Codebase.getPulse().currentTime()) / net.sourceforge.pain.Pulse.PULSE_PER_SCD;
    }
}