/***************************** LICENSE START ***********************************

 Copyright 2012 ECMWF and INPE. This software is distributed under the terms
 of the Apache License version 2.0. In applying this license, ECMWF does not
 waive the privileges and immunities granted to it by virtue of its status as
 an Intergovernmental Organization or submit itself to any jurisdiction.

 ***************************** LICENSE END *************************************/

#include <Assertions.hpp>
#include <MvRequest.h>

#include "DataBuilder.h"
#include "ObjectList.h"
#include "PmContext.h"
#include "MvDecoder.h"
#include "SuperPage.h"
#include "Root.h"
#include "Task.h"

// This is the singleton instance of the prototype 
static DataBuilder dataBuilderInstance("DataBuilder");

Presentable*
DataBuilder::Execute (PmContext& context)
{
   MvRequest dataReq = context.InRequest();

   // Make sure the macro is generated in current dir, even when defaults are used.
   const char* fullName = (const char*)dataReq("_NAME");
   const char* path = 0;
   if ( fullName )
      path = mdirname(fullName);

   // Creation of a new PlotPage and associated pages
   Presentable* superpage = 0;
   MvRequest defaultSuperPage = ObjectList::CreateDefaultRequest ( "PLOT_SUPERPAGE",0,path );

   // Create default page and add view to this request
   MvRequest pageRequest = ObjectList::CreateDefaultRequest ( "PLOT_PAGE" );

   // First try to get view from the context
   const char* viewName = GetView(context);

#if 0 //uPlot
// This code is doing nothing for GRIB data.
// I am not sure if this code should work for other data formats.
// For the moment, it has been removed.

  // Then try to get from contents of file
  if ( ! (const char *)viewName )
  {
      auto_ptr<Decoder> decoder ( DecoderFactory::Make ( context.InRequest() ) );
      viewName = decoder->GetView();
  }
#endif

   // Create view request
   if ( viewName )
   {
      // Check if there is a view request
      MvRequest viewRequest = dataReq("_VIEW_REQUEST");
      if ( !viewRequest )
      {
         // Build a default
         viewRequest = ObjectList::UserDefaultRequest( viewName, true );
         viewRequest("_ORIGIN") = "DataBuilder";
      }
      pageRequest("VIEW") = viewRequest;
   }

   defaultSuperPage("PAGES") = pageRequest;

   superpage = new SuperPage ( defaultSuperPage );
   ensure ( superpage != 0 );

   // Put the new branch in the tree
   Root::Instance().Insert ( superpage );

   // Add the page Ids in the reply
   // Create a Reply
   MvRequest reply;
   superpage->CreateReply ( reply );
   context.AddToReply ( reply );

   // Drop the data and add draw task if needed
#if 0
if ( !superpage->HasDrawTask () )
  {
      AddTask( *superpage, &Presentable::DrawProlog );
      AddTask( *superpage, &Presentable::Draw );
      superpage->HasDrawTask ( true );
  }
#endif
   superpage->Drop(context);

   return superpage;
}
