#ifndef IMAGES_IMAGEEDECIMATOR_H
#define IMAGES_IMAGEEDECIMATOR_H

#include <imageanalysis/ImageAnalysis/ImageTask.h>

#include <imageanalysis/ImageAnalysis/ImageDecimatorData.h>

#include <casacore/casa/namespace.h>

namespace casa {

template <class T> class ImageDecimator : public ImageTask<T> {
    // <summary>
    // Top level interface for removing image planes.
    // </summary>

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

    // <prerequisite>
    // </prerequisite>

    // <etymology>
    // Decimates planes of image
    // </etymology>

    // <synopsis>
    // Top level interface for removing image planes.
    // </synopsis>

public:

    ImageDecimator(
        const SPCIIT image,
        const casacore::Record *const region,
        const casacore::String& maskInp,
        const casacore::String& outname, casacore::Bool overwrite
    );

    // destructor
    ~ImageDecimator() {}

    SPIIT decimate() const;

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

    // every nth plane will be kept
    void setFactor(casacore::uInt n);

    // Set the pixel axis number along which the decimation will occur
    void setAxis(casacore::uInt n);

    // set the decimation function
    void setFunction(ImageDecimatorData::Function f);

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

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

    inline casacore::Bool _supportsMultipleBeams() const {return false;}

    inline casacore::Bool _supportsMultipleRegions() const {return true;}

private:
    casacore::uInt _axis, _factor;
    ImageDecimatorData::Function _function;

    // disallow default constructor
    ImageDecimator();
};
}

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

#endif