#include <TApplication.h>

#include "MAGIC.h"

#include "MLog.h"
#include "MLogManip.h"

#include "MArgs.h"
#include "MArray.h"
#include "MParContainer.h"

#ifdef HAVE_XPM
#include "MLogo.h"
#endif

#include "MCameraDisplay.h"
#include "MEventDisplay.h"

using namespace std;

// **********************************************************************
//
//    MARS main program  
//
//    The only job of the main program is the initialization of ROOT and 
//    the start of the GUI interface for the mars program
//
//    started by  h. kornmayer      january, 3rd  2001 
static void StartUpMessage()
{
    gLog << all << endl;

    //                1         2         3         4         5
    //       12345678901234567890123456789012345678901234567890
    gLog << "==================================================" << endl;
    gLog << "                    MARS V" << MARSVER              << endl;
    gLog << "    Magic Analysis and Reconstruction Software"     << endl;
    gLog << "   Compiled with ROOT v" << ROOT_RELEASE << " on <" << __DATE__ << ">" << endl;
    gLog << "==================================================" << endl;
    gLog << endl;
}

static void Usage()
{
    gLog << all << endl;
    gLog << "Sorry the usage is:" << endl;
    gLog << " mars [options] [filename]" << endl << endl;
    gLog << " Options:" << endl;
    gLog.Usage();
    gLog << "     -?/-h: This help" << endl << endl;
}

int main(int argc, char **argv)
{
    if (!MARS::CheckRootVer())
        return 0xff;

    //
    // Evaluate arguments
    //
    MArgs arg(argc, argv, kTRUE);
    gLog.Setup(arg);

    StartUpMessage();

    if (arg.HasOption("-?") || arg.HasOption("-h") || arg.GetNumArguments()>1)
    {
        Usage();
        return 2;
    }

    //
    // This is to make argv[i] more readable inside the code
    //
    const TString kFilename = arg.GetArgumentStr(0);

#ifdef HAVE_XPM
    MLogo logo;
    logo.Popup();
#endif

    //
    // initialize ROOT
    //
    TApplication app("mars", &argc, argv);
    if (gROOT->IsBatch() || !gClient)
    {
        gLog << "Bombing... maybe your DISPLAY variable is not set correctly!" << endl;
        return 1;
    }

    //
    // Switch of TObject Streamer in our base classes derived from TObject
    //
    MArray::Class()->IgnoreTObjectStreamer();
    MParContainer::Class()->IgnoreTObjectStreamer();

#ifdef HAVE_XPM
    logo.Popdown();
#endif

    //
    // start the main window
    //
    if (kFilename.IsNull())
        new MCameraDisplay;
    else
    {
        MEventDisplay *d = new MEventDisplay(kFilename);
        d->SetBit(MStatusDisplay::kExitLoopOnExit);
        d->SetTitle(kFilename);
    }

    //
    // run the application
    //
    app.Run();

    gLog << all << endl;

    return 0;
}
 

