/**
* @file         ImageMetadata.hpp
*
* Purpose       Class definition of ImageMetadata class
*
* Authors       Dinesh Iyer
*
* Copyright     2019-2021 MathWorks, Inc.
*
*/

#ifndef imagesdatatypesimagemetadata_header
#define imagesdatatypesimagemetadata_header

#include "datatypes_util.hpp"
#include "ImageDefs.hpp"

namespace images
{
    namespace datatypes
    {
        class ImageMetadata
        {
            public:
                // ------------------------------------------------
                // Life time
                // ------------------------------------------------
 
                /**
                  * Default constructor
                  * This represents metadata for an empty Image
                  */
                ImageMetadata()
                    : ImageMetadata( 0, 0, 3, 
                                     ClassUnderlying::Uint8,
                                     ColorFormat::RGB,
                                     Layout::RowMajorInterleaved )
                {}

                /**
                  * Create the metadata for describing an image
                  *
                  * @param - rows - Number of rows in the image
                  * @param - columns - Number of columns in the image
                  * @param - numChannels - Number of channels in the image
                  * @param - dtype - Datatype of the underlying data
                  * @param - format - ColorFormat of the image data
                  * @param - layout - Layout of the image data
                  * @param - relinquish - YES indicates the instance can give up its
                  *                        underlying data buffer without a data copy
                  */
                ImageMetadata( DimType rows,
                               DimType columns,
                               DimType numChannels,
                               ClassUnderlying dtype,
                               ColorFormat format,
                               Layout layout )
                    : fRows(rows), fColumns(columns), fNumChannels(numChannels),
                      fClassUnderlying(dtype),
                      fColorFormat(format),
                      fLayout(layout)
                {}

                // Not really necessary. But adding for completeness
                ~ImageMetadata() noexcept 
                {}

                // ------------------------------------------------
                // Copy and assignment operations
                // ------------------------------------------------
                // Miranda operations are sufficient for this class

                // ------------------------------------------------
                // Property Getters/Setters
                // ------------------------------------------------
                DimType getRows() const { return fRows; }
                DimType getColumns() const { return fColumns; }
                DimType getNumChannels() const { return fNumChannels; }
 
                ClassUnderlying getClassUnderlying() const { return fClassUnderlying; }
                ColorFormat getColorFormat() const { return fColorFormat; }
                Layout getLayout() const { return fLayout; }

                void setRows(DimType rows) { fRows = rows; }
                void setColumns(DimType cols) { fColumns = cols; }
                void setNumChannels(DimType chans) { fNumChannels = chans; }

                void setClassUnderlying(ClassUnderlying c) { fClassUnderlying = c; }
                void setColorFormat(ColorFormat cf) { fColorFormat = cf; }
                void setLayout(Layout l) { fLayout = l; }


            private:
                // ------------------------------------------------
                // Properties
                // ------------------------------------------------
                DimType fRows;
                DimType fColumns;
                DimType fNumChannels;
                ClassUnderlying fClassUnderlying;
                ColorFormat fColorFormat;
                Layout fLayout;
        };
    }
}


#endif // imagesdatatypesimagemetadata_header