/** \file
 *
 *  Contains the Scheduler class declaration.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#include "logger/Logger.h"
#include "utils/FastMap.h"
#include "utils/Mutex.h"

#include "ScheduledItem.h"

#ifndef SCHEDULER_H_
#define SCHEDULER_H_

class Scheduler
{

    friend class CommandExec;

public:

    Scheduler();

    virtual ~Scheduler()
    {}

    void Schedule( ScheduledItem* newItem, Logger& logger );
    bool Remove( int index, Logger& logger, bool quiet );
    void Clear( const Str& id, Logger& logger );
    void DoScheduled( Logger& logger );
    void List( Logger& logger );
    void Pause( Syslog::Severity schedulePauseSeverity, Timestamp pauseTime, Logger& logger );
    void Resume( Logger& logger );
    void ShowPaused( Logger& logger );

    int GetScheduleIndex( void )
    {
        return ScheduleIndex_;
    }

protected:

    Mutex ScheduledItemsMutex_;
    FlexArray<ScheduledItem*> ScheduledItems_;
    int ScheduleIndex_;

    Mutex SchedulePauseMutex_;
    Syslog::Severity SchedulePauseSeverity_;
    Timestamp SchedulePauseTime_;

    bool schedulePaused( void );

private:

    // No copies
    Scheduler( const Scheduler& );
    Scheduler& operator= ( const Scheduler& );

};

#endif /* SCHEDULER_H_ */
