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

#include "Wait.h"
#include "WaitIF.h"
#include "OffshoreEnvelopeIF.h"

#include "data/Slate.h"
#include "units/Units.h"

Wait::Wait( const Str& prefix, const Module* module )
    : Behavior( prefix + WaitIF::NAME, module, true, true ),
      endTime_( Timespan::INVALID_TIMESPAN ),
      durationSeconds_( nanf( "" ) )
{

    logger_.syslog( "Construct Wait." );

    // Slate input setting variables
    durationSettingReader_ = newSettingReader( WaitIF::DURATION_SETTING );

    // Slate input measurements

    // Slate output variables
}

Wait::~Wait()
{}

/// Initialize function
void Wait::initialize( void )
{
    logger_.syslog( "Initialize Wait Component." );
    endTime_ = Timespan::INVALID_TIMESPAN;
}

void Wait::run()
{
    runIfUnsatisfied();
}

/// The actual "payload" of the component
bool Wait::runIfUnsatisfied()
{
    if( durationSettingReader_->isActive() )
    {
        float newDurationSetting( nanf( "" ) );
        durationSettingReader_->read( Units::SECOND, newDurationSetting );
        if( endTime_ == Timespan::INVALID_TIMESPAN ||
                durationSeconds_ != newDurationSetting )
        {
            durationSeconds_ = newDurationSetting;
            endTime_ = Timestamp::Now() + Timespan( durationSeconds_ );
        }
    }

    if( calcSatisfied( ) )
    {
        logger_.syslog( "Done Waiting.", Syslog::INFO );
        return true;
    }

    return false;
}

bool Wait::isSatisfied()
{
    return calcSatisfied();
}

/// Uninit function
void Wait::uninitialize( void )
{
    logger_.syslog( "Uninitialize Wait Component." );
}

/// Mission Component factory interface
Behavior* Wait::CreateBehavior( const Str& prefix, const Module* module )
{
    return new Wait( prefix, module );
}

bool Wait::calcSatisfied( )
{
    return endTime_ != Timespan::INVALID_TIMESPAN && Timestamp::Now() >= endTime_;
}

