// This file is part of IBC.
// Copyright (C) 2004 Steven M. Kearns ([email protected] )
// Copyright (C) 2004 - 2018 Richard L King ([email protected])
// For conditions of distribution and use, see copyright notice in COPYING.txt

// IBC is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// IBC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with IBC.  If not, see <http://www.gnu.org/licenses/>.

package ibcalpha.ibc;

import java.awt.Toolkit;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

class StopTask
        implements Runnable {

    private static final SwitchLock _Running = new SwitchLock();

    private final CommandChannel mChannel;

    public StopTask(final CommandChannel channel) {
        mChannel = channel;
    }

    @Override
    public void run() {
        if (! _Running.set()) {
            writeNack("STOP already in progress");
            return;
        }

        try {
            MyCachedThreadPool.getInstance().shutdownNow();
            MyScheduledExecutorService.getInstance().shutdownNow();
            
            writeInfo("Closing IBC");
            stop();
        } catch (Exception ex) {
            writeNack(ex.getMessage());
        }
    }
    
    public final static boolean shutdownInProgress()
    {
        return _Running.query();
    }

    private void stop() {
        JFrame jf = MainWindowManager.mainWindowManager().getMainWindow();
        
        WindowEvent wev = new WindowEvent(jf, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);

        writeAck("Shutting down");
    }

    private void writeAck(String message) {if (! (mChannel == null)) mChannel.writeAck(message);}
    private void writeInfo(String message) {if (! (mChannel == null)) mChannel.writeInfo(message);}
    private void writeNack(String message) {if (! (mChannel == null)) mChannel.writeNack(message);}

}