#include "vtkMergeBlocksFilter.h"

#include <vtkAppendFilter.h>
#include <vtkObjectFactory.h>
#include <vtkMultiBlockDataSet.h>
#include <vtkInformation.h>
#include <vtkInformationVector.h>
#include <vtkSmartPointer.h>
#include <vtkUnstructuredGrid.h>

vtkCxxRevisionMacro(vtkMergeBlocksFilter, "$Revision: 0.1 $");
vtkStandardNewMacro(vtkMergeBlocksFilter);

vtkMergeBlocksFilter::vtkMergeBlocksFilter()
{
}

vtkMergeBlocksFilter::~vtkMergeBlocksFilter()
{
}

int vtkMergeBlocksFilter::FillInputPortInformation(int, vtkInformation* info)
{
	info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkMultiBlockDataSet");
	return 1;
}

int vtkMergeBlocksFilter::FillOutputPortInformation(int, vtkInformation* info)
{
	info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkUnstructuredGrid");
	return 1;	
}


int vtkMergeBlocksFilter::RequestData(
        vtkInformation* vtkNotUsed(request),
        vtkInformationVector** inputVector,
        vtkInformationVector* outputVector)
{
	this->DebugOn();
    vtkInformation* inInfo = inputVector[0]->GetInformationObject(0);
    vtkMultiBlockDataSet* input = vtkMultiBlockDataSet::SafeDownCast(
        inInfo->Get(vtkDataObject::DATA_OBJECT()));
    if(!input) 
    {
        vtkDebugMacro(<<"Invalid input");
        return 0;
    }

    vtkInformation* outInfo = outputVector->GetInformationObject(0);
    vtkUnstructuredGrid* output = vtkUnstructuredGrid::SafeDownCast(
        outInfo->Get(vtkDataObject::DATA_OBJECT()));
    if(!output) 
    {
        vtkDebugMacro(<<"Invalid output");
        return 0;
    }
	
	vtkSmartPointer<vtkAppendFilter> appender = vtkSmartPointer<vtkAppendFilter>::New();
	for(int i=0; i<input->GetNumberOfBlocks(); ++i)
	{
		appender->AddInput(input->GetBlock(i));
	}

	appender->Update();
	output->DeepCopy(appender->GetOutput());

    return 1;
}

void vtkMergeBlocksFilter::PrintSelf(ostream& os, vtkIndent indent)
{
  this->Superclass::PrintSelf(os,indent);
}
