/** \file
 *
 *  Contains the LuaMissionAPI class implementation.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */
#include "LuaMissionAPI.h"

#include "missionScript/MissionNode.h"
#include "xml/XmlAPI.h"

LuaMissionAPI LuaMissionAPI::MissionAPIInstance_;

LuaMissionAPI::~LuaMissionAPI() {}

/// Load the mission with the indicated filename
/// In case of error, log message with indicated severity
MissionNode* LuaMissionAPI::loadMissionFile( const char* filename, Logger& logger,
        Syslog::Severity severity )
{
    const char* errMessage = LuaAPI::Exec( "package.path = package.path .. \";./Lua/?.lua\"" );
    if( NULL != errMessage )
    {
        logger.syslog( Str( "Cannot append Lua search path " ) + filename + " due to: " + errMessage, severity );
        return NULL;
    }

    errMessage = LuaAPI::LoadFile( filename );
    if( NULL != errMessage )
    {
        logger.syslog( Str( "Cannot load Lua file " ) + filename + " due to: " + errMessage, severity );
        return NULL;
    }

    errMessage = LuaAPI::Run();
    if( NULL != errMessage )
    {
        logger.syslog( Str( "Cannot run Lua file " ) + filename + " due to: " + errMessage, severity );
        return NULL;
    }


    Str xml;
    errMessage = LuaAPI::RunFunction( "__MISSION_TO_XML", xml, true );
    if( NULL != errMessage )
    {
        logger.syslog( Str( "Cannot convert Lua file to xml " ) + filename + " due to: " + errMessage, severity );
        return NULL;
    }

    MissionNode* missionNode = XmlAPI::ParseMission( xml.cStr(), logger, severity );
    if( NULL == missionNode )
    {
        return NULL;
    }

    //missionNode->debugPrint();

    return missionNode;
}

LuaMissionAPI::LuaMissionAPI()
    : MissionAPI( "Lua", ".lua" )
{}

