//--------------------------------
// Includes
//--------------------------------
#include "MantidDataHandling/CreateSampleShape.h"
#include "MantidGeometry/Objects/ShapeFactory.h"
#include "MantidAPI/MatrixWorkspace.h"
#include "MantidAPI/Sample.h"

namespace Mantid
{
namespace DataHandling
{
  // Register the algorithm into the AlgorithmFactory
  DECLARE_ALGORITHM(CreateSampleShape)
}
}

using namespace Mantid::DataHandling;
using namespace Mantid::API;

/**
 * Initialize the algorithm
 */
void CreateSampleShape::init()
{
  //this->setWikiSummary("Create a shape object to model the sample.");
  //this->setOptionalMessage("Create a shape object to model the sample.");

  using namespace Mantid::Kernel;
  declareProperty(
    new WorkspaceProperty<MatrixWorkspace>("InputWorkspace","",Direction::Input),
    "The workspace with which to associate the sample ");
  declareProperty("ShapeXML","",new MandatoryValidator<std::string>(),
    "The XML that describes the shape" );
}

/**
 * Execute the algorithm
 */
void CreateSampleShape::exec()
{  
  // Get the input workspace
  MatrixWorkspace_sptr workspace = getProperty("InputWorkspace");
  // Get the XML definition
  std::string shapeXML = getProperty("ShapeXML");
  Geometry::ShapeFactory sFactory;
  // Create the object
  boost::shared_ptr<Geometry::Object> shape_sptr = sFactory.createShape(shapeXML);
  // Check it's valid and attach it to the workspace sample
  if( shape_sptr->hasValidShape() )
  {
    workspace->mutableSample().setShape(*shape_sptr);
  }
  else
  {
    g_log.warning() << "Object has invalid shape. TopRule = " << shape_sptr->topRule() 
		    << ", number of surfaces = " << shape_sptr->getSurfacePtr().size() << "\n";
    throw std::runtime_error("Shape object is invalid, cannot attach it to workspace."); 
  }
  // Done!
  progress(1);
}