#ifndef IMAGES_IMAGEFFTER_H
#define IMAGES_IMAGEFFTER_H

#include <imageanalysis/ImageAnalysis/ImageTask.h>

#include <casacore/casa/namespace.h>

namespace casa {

template <class T> class ImageFFT;

template <class T> class ImageFFTer : public ImageTask<T> {
	// <summary>
	// Top level interface which allows FFTing of images.
	// </summary>

	// <reviewed reviewer="" date="" tests="" demos="">
	// </reviewed>

	// <prerequisite>
	// </prerequisite>

	// <etymology>
	// FFTs image.
	// </etymology>

	// <synopsis>
	// High level interface for FFTing an image.
	// </synopsis>

public:

	ImageFFTer(
		const SPCIIT image, const casacore::Record *const region,
		const casacore::String& maskInp,
		const casacore::Vector<casacore::uInt>& axes
	);

	// destructor
	~ImageFFTer() {}

	void fft() const;

	void setReal(const casacore::String& name) { _real = name; }
	void setImag(const casacore::String& name) { _imag = name; }
	void setAmp(const casacore::String& name) { _amp = name; }
	void setPhase(const casacore::String& name) { _phase = name; }
	void setComplex(const casacore::String& name) { _complex = name; }

	casacore::String getClass() const {
	    const static casacore::String s = "ImageFFTer";
	    return s;
	}

protected:
	CasacRegionManager::StokesControl _getStokesControl() const {
		return CasacRegionManager::USE_ALL_STOKES;
	}

	std::vector<casacore::Coordinate::Type> _getNecessaryCoordinates() const {
		return std::vector<casacore::Coordinate::Type>();
	}

private:
	casacore::Vector<casacore::uInt> _axes;
	casacore::String _real, _imag, _amp, _phase, _complex;

	// disallow default constructor
	ImageFFTer();

	void _createOutputImages(
	    const casacore::SubImage<T>& subImage, const ImageFFT<T>& fft
	) const;

	template <class U> void _createImage(
	    SPIIU& out, const casacore::String& name,
	    const casacore::SubImage<T>& subimage
	) const;

	static void _checkExists(const casacore::String& name);
};
}

#ifndef AIPS_NO_TEMPLATE_SRC
#include <imageanalysis/ImageAnalysis/ImageFFTer.tcc>
#endif

#endif