#ifndef IMAGEANALYSIS_IMAGEMASKHANDLER_H
#define IMAGEANALYSIS_IMAGEMASKHANDLER_H

#include <casacore/casa/BasicSL/String.h>
#include <casacore/casa/Arrays/Vector.h>
#include <casacore/casa/Containers/Record.h>
#include <casacore/casa/Containers/Block.h>
#include <imageanalysis/ImageTypedefs.h>

// #include <lattices/Lattices/LatticeExprNode.h>

#include <set>

namespace casacore {
class ImageRegion;
class LatticeExprNode;
template <class T> class  MaskedLattice;
}

namespace casa {

template <class T> class ImageMaskHandler {

    // <summary>
    // Perform various image mask operations
    // </summary>

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

    // <prerequisite>
    // </prerequisite>

    // <etymology>
    // </etymology>

    // <synopsis>
    // </synopsis>

public:
	ImageMaskHandler(SPIIT);

    ~ImageMaskHandler();

    // set default mask. Empty string means unset default mask.
    void set(const casacore::String& name);

    // return the default mask name
    casacore::String defaultMask() const;

    // delete specified masks
    void deleteMasks(const std::set<casacore::String>& masks);

    // rename a mask
    void rename(const casacore::String& oldName, const casacore::String& newName);

    // get all mask names
    casacore::Vector<casacore::String> get() const;

    // copy mask
    void copy(const casacore::String& currentName, const casacore::String& newName);

    void calcmask(
    	const casacore::String& mask, casacore::Record& regions,
		const casacore::String& name, casacore::Bool asdefault=true
    );

    // copy the mask from the specified lattice to the image's (default) mask. The mask
    // and the image must have the same shape.
    template <class U> void copy(const casacore::MaskedLattice<U>& mask);

private:
    const SPIIT _image;

    void _calcmask(
    	const casacore::LatticeExprNode& node,
		const casacore::String& name, const casacore::Bool makedefault
    );

    // Make a block of regions from a Record
    static void _makeRegionBlock(
        casacore::PtrBlock<const casacore::ImageRegion*>& regions,
        const casacore::Record& Regions
    );
};

}

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

#endif