/** \file
 *
 *  Contains the ReinitializeHFRCMVirtualSurfaceDrifter class implementation.
 *
 *  Copyright (c) 2013, 2014 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#include "ReinitializeHFRCMVirtualSurfaceDrifter.h"
#include "ReinitializeHFRCMVirtualSurfaceDrifterIF.h"

#include "HFRCMVirtualSurfaceDrifter.h" // for pulblic method reinitialize

#include "utils/AuvMath.h"
#include "utils/Timestamp.h"

ReinitializeHFRCMVirtualSurfaceDrifter::ReinitializeHFRCMVirtualSurfaceDrifter( const Str& prefix, const Module* module )
    : Behavior( prefix, module, true, true ),
      initLatSettingReader_( newSettingReader( ReinitializeHFRCMVirtualSurfaceDrifterIF::INITIAL_LATITUDE_SETTING ) ),
      initLonSettingReader_( newSettingReader( ReinitializeHFRCMVirtualSurfaceDrifterIF::INITIAL_LONGITUDE_SETTING ) )
{
    logger_.syslog( "Construct ReinitializeHFRCMVirtualSurfaceDrifter." );
}

ReinitializeHFRCMVirtualSurfaceDrifter::~ReinitializeHFRCMVirtualSurfaceDrifter()
{}

void ReinitializeHFRCMVirtualSurfaceDrifter::initialize( void )
{
    logger_.syslog( "Initializing ReinitializeHFRCMVirtualSurfaceDrifter component." );
}

bool ReinitializeHFRCMVirtualSurfaceDrifter::runIfUnsatisfied( void )
{
    run(); // This component should only run once if called.
    return true;
}
void ReinitializeHFRCMVirtualSurfaceDrifter::run( void )
{
    double latitude, longitude;
    if( initLatSettingReader_->isActive() && initLonSettingReader_->isActive() )
    {
        // Read in settings from mission
        bool gotNewLat = initLatSettingReader_->read( Units::RADIAN, latitude );
        bool gotNewLon = initLonSettingReader_->read( Units::RADIAN, longitude );

        if( gotNewLat && gotNewLon && !isnan( latitude ) && !isnan( longitude ) )
        {
            logger_.syslog( "Setting HFRCMVirtualSurfaceDrifter position: " + Str( R2D( latitude ) ) + ", " + Str( R2D( longitude ) ), Syslog::DEBUG );
            HFRCMVirtualSurfaceDrifter::Reinitialize( latitude, longitude ); // call the public method from HFRCMVirtualSurfaceDrifter
        }
        else
        {
            // should probably log a message
        }
    }
    else
    {
        // Should it actually do anything otherwise?
    }
}

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