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

#include "TextTableLogWriter.h"

#include "logger/DataEntry.h"

/// Constructor
TextTableLogWriter::TextTableLogWriter( const char* separator, int varCount, char** varList, char** unitList, bool hideUnits, bool interpolate )
    : TableLogWriter( varCount, varList, unitList, interpolate ),
      separator_( separator ),
      hideUnits_( hideUnits ),
      valueStrings_( new Str[ varCount ] )
{
    for( int i = 0; i < varCount_; ++i )
    {
        // Trying append here to please Coverity
        valueStrings_[ i ].append( "nan" );
    }
    initializeTextTableLogWriter();
}

/// Destructor
TextTableLogWriter::~TextTableLogWriter()
{
    delete[] valueStrings_;
}

void TextTableLogWriter::initializeTextTableLogWriter()
{
    *buf_ = 0;
}

unsigned int TextTableLogWriter::writeHeader()
{
    unsigned int bytesWritten( 0 );
    if( isValid() )
    {
        bytesWritten += logStream_->write( "Timestamp" ).bytesWritten();
        bytesWritten += logStream_->write( separator_ ).bytesWritten();
        bytesWritten += logStream_->write( "EpochSeconds" ).bytesWritten();
        for( int i = 0; i < varCount_; ++i )
        {
            bytesWritten += logStream_->write( separator_ ).bytesWritten();
            bytesWritten += logStream_->write( varList_[ i ] ).bytesWritten();
        }
        bytesWritten += logStream_->writeChar( 10 ).bytesWritten();
    }
    return bytesWritten;
}

unsigned int TextTableLogWriter::writeFooter()
{
    if( !wroteFooter_ )
    {
        TableLogWriter::writeFooter();
        wroteFooter_ = true;
        return writeRow();
    }
    return 0;
}

unsigned int TextTableLogWriter::writeRow()
{
    unsigned int bytesWritten( 0 );
    if( isValid() )
    {
        bytesWritten += logStream_->write( lastTime_.toString( buf_, 79 ) ).bytesWritten();
        bytesWritten += logStream_->write( separator_ ).bytesWritten();
        bytesWritten += logStream_->write( Str( lastTime_.asDouble(), 3 ).cStr() ).bytesWritten();
        for( int i = 0; i < varCount_; ++i )
        {
            bytesWritten += logStream_->write( separator_ ).bytesWritten();
            bytesWritten += logStream_->write( valueStrings_[ i ].cStr() ).bytesWritten();
        }
        bytesWritten += logStream_->writeChar( 10 ).bytesWritten();
    }
    return bytesWritten;
}


unsigned int TextTableLogWriter::writeToColumn( const DataEntry *dataEntry, const int column )
{
    if( NULL != dataEntry )
    {
        valueStrings_[ column ] = dataEntry->getDataValueString( units_[column], hideUnits_ );
    }
    else
    {
        valueStrings_[ column ] = "nan";
    }
    return 0;
}

