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

#include "HFRadarModel.h"
#include "HFRadarModelIF.h"

#include "data/UniversalDataReader.h"
#include "estimationModule/HFRadarModelCalc.h"

HFRadarModel::HFRadarModel( const Str& prefix, const Module* module )
    : Behavior( prefix, module, true, true ),
      latitudeReader_( newUniversalReader( UniversalURI::LATITUDE ) ),
      longitudeReader_( newUniversalReader( UniversalURI::LONGITUDE ) )
{
    // Argument output variables - defined at initialization
    uWriter_ = NULL;
    vWriter_ = NULL;
}

HFRadarModel::~HFRadarModel()
{}

void HFRadarModel::initialize( void )
{
    if( NULL == uWriter_ )
    {
        uWriter_ = findArgWriter( HFRadarModelIF::EASTWARD_SURFACE_CURRENT_OUTPUT );
    }
    if( NULL == vWriter_ )
    {
        vWriter_ = findArgWriter( HFRadarModelIF::NORTHWARD_SURFACE_CURRENT_OUTPUT );
    }

}

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

bool HFRadarModel::runIfUnsatisfied( void )
{
    float latitude( nanf( "" ) ), longitude( nanf( "" ) );
    bool ok = latitudeReader_->read( Units::DEGREE, latitude );
    ok &= !isnan( latitude );
    ok &= longitudeReader_->read( Units::DEGREE, longitude );
    ok &= !isnan( longitude );
    HFRadarModelCalc* calc = HFRadarModelCalc::Instance();
    ok &= NULL != calc;
    if( ok )
    {
        float u( nanf( "" ) ), v( nanf( "" ) );
        ok &= calc->lookup( u, v, 0.0f, latitude, longitude );
        //printf( "*************** u=%f,v=%f, ok=%d\n", u, v, ok );
        if( ok && NULL != uWriter_ )
        {
            uWriter_->write( Units::CENTIMETER_PER_SECOND, u );
        }
        if( ok && NULL != vWriter_ )
        {
            vWriter_->write( Units::CENTIMETER_PER_SECOND, v );
        }
    }
    return ok;
}

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