/****************************************************************************
 * Copyright by The HDF Group.                                               *
 * Copyright by the Board of Trustees of the University of Illinois.         *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF Java Products. The full HDF Java copyright       *
 * notice, including terms governing use, modification, and redistribution,  *
 * is contained in the file, COPYING.  COPYING can be found at the root of   *
 * the source code distribution tree. You can also access it online  at      *
 * http://www.hdfgroup.org/products/licenses.html.  If you do not have       *
 * access to the file, you may request a copy from help@hdfgroup.org.        *
 ****************************************************************************/

package hdf.hdflib;

/**
 * <p>
 * This interface defines the values of constants defined by the HDF 4.2 API.
 */
public class HDFConstants {
    /** FAIL */
    public static final int FAIL = -1;

    // file access code definitions
    public static final int DFACC_READ = 1;
    public static final int DFACC_WRITE = 2;
    public static final int DFACC_RDWR = 3;
    public static final int DFACC_CREATE = 4;
    public static final int DFACC_RDONLY = DFACC_READ;
    public static final int DFACC_DEFAULT = 000;
    public static final int DFACC_SERIAL = 001;
    public static final int DFACC_PARALLEL = 011;

    // annotation type in HDF
    public static final int AN_DATA_LABEL = 0;
    public static final int AN_DATA_DESC = AN_DATA_LABEL + 1;
    public static final int AN_FILE_LABEL = AN_DATA_LABEL + 2;
    public static final int AN_FILE_DESC = AN_DATA_LABEL + 3;

    // HDF Tag Definations

    public static final int DFREF_WILDCARD = 0;
    public static final int DFTAG_WILDCARD = 0;

    public static final int DFREF_NONE = 0; // used by mfhdf/libsrc/putget.c

    // tags and refs
    public static final int DFTAG_NULL = 1;
    public static final int DFTAG_LINKED = 20; // linked-block special element
    public static final int DFTAG_VERSION = 30;
    public static final int DFTAG_COMPRESSED = 40; // compressed special element
    public static final int DFTAG_VLINKED = 50; // variable-len linked-block header
    public static final int DFTAG_VLINKED_DATA = 51; // variable-len linked-block data
    public static final int DFTAG_CHUNKED = 60; // chunked special element header
    public static final int DFTAG_CHUNK = 61; // chunk element

    // utility set
    public static final int DFTAG_FID = 100; // File identifier
    public static final int DFTAG_FD = 101; // File description
    public static final int DFTAG_TID = 102; // Tag identifier
    public static final int DFTAG_TD = 103; // Tag descriptor
    public static final int DFTAG_DIL = 104; // data identifier label
    public static final int DFTAG_DIA = 105; // data identifier annotation
    public static final int DFTAG_NT = 106; // number type
    public static final int DFTAG_MT = 107; // machine type
    public static final int DFTAG_FREE = 108; // free space in the file

    // raster-8 set
    public static final int DFTAG_ID8 = 200; // 8-bit Image dimension
    public static final int DFTAG_IP8 = 201; // 8-bit Image palette
    public static final int DFTAG_RI8 = 202; // Raster-8 image
    public static final int DFTAG_CI8 = 203; // RLE compressed 8-bit image
    public static final int DFTAG_II8 = 204; // IMCOMP compressed 8-bit image

    // Raster Image set
    public static final int DFTAG_ID = 300; // Image DimRec
    public static final int DFTAG_LUT = 301; // Image Palette
    public static final int DFTAG_RI = 302; // Raster Image
    public static final int DFTAG_CI = 303; // Compressed Image
    public static final int DFTAG_NRI = 304; // New-format Raster Image

    public static final int DFTAG_RIG = 306; // Raster Image Group
    public static final int DFTAG_LD = 307; // Palette DimRec
    public static final int DFTAG_MD = 308; // Matte DimRec
    public static final int DFTAG_MA = 309; // Matte Data
    public static final int DFTAG_CCN = 310; // color correction
    public static final int DFTAG_CFM = 311; // color format
    public static final int DFTAG_AR = 312; // aspect ratio

    public static final int DFTAG_DRAW = 400; // Draw these images in sequence
    public static final int DFTAG_RUN = 401; // run this as a program/script

    public static final int DFTAG_XYP = 500; // x-y position
    public static final int DFTAG_MTO = 501; // machine-type override

    // Tektronix
    public static final int DFTAG_T14 = 602; // TEK 4014 data
    public static final int DFTAG_T105 = 603; // TEK 4105 data

    // Scientific Data set
    // Objects of tag 721 are never actually written to the file. The tag is
    // needed to make things easier mixing DFSD and SD style objects in the
    // same file

    public static final int DFTAG_SDG = 700; // Scientific Data Group
    public static final int DFTAG_SDD = 701; // Scientific Data DimRec
    public static final int DFTAG_SD = 702; // Scientific Data
    public static final int DFTAG_SDS = 703; // Scales
    public static final int DFTAG_SDL = 704; // Labels
    public static final int DFTAG_SDU = 705; // Units
    public static final int DFTAG_SDF = 706; // Formats
    public static final int DFTAG_SDM = 707; // Max/Min
    public static final int DFTAG_SDC = 708; // Coord sys
    public static final int DFTAG_SDT = 709; // Transpose
    public static final int DFTAG_SDLNK = 710; // Links related to the dataset
    public static final int DFTAG_NDG = 720; // Numeric Data Group
    public static final int DFTAG_CAL = 731; // Calibration information
    public static final int DFTAG_FV = 732; // Fill Value information
    public static final int DFTAG_BREQ = 799; // Beginning of required tags
    public static final int DFTAG_SDRAG = 781; // List of ragged array line lengths
    public static final int DFTAG_EREQ = 780; // Current end of the range

    // VSets
    public static final int DFTAG_VG = 1965; // Vgroup
    public static final int DFTAG_VH = 1962; // Vdata Header
    public static final int DFTAG_VS = 1963; // Vdata Storage

    // compression schemes
    public static final int DFTAG_RLE = 11; // run length encoding
    public static final int DFTAG_IMC = 12; // IMCOMP compression alias
    public static final int DFTAG_IMCOMP = 12; // IMCOMP compression
    public static final int DFTAG_JPEG = 13; // JPEG compression (24-bit data)
    public static final int DFTAG_GREYJPEG = 14; // JPEG compression (8-bit data)
    public static final int DFTAG_JPEG5 = 15; // JPEG compression (24-bit data)
    public static final int DFTAG_GREYJPEG5 = 16; // JPEG compression (8-bit data)

    /** pixel interlacing scheme */
    public static final int MFGR_INTERLACE_PIXEL = 0;

    /** line interlacing scheme */
    public static final int MFGR_INTERLACE_LINE = MFGR_INTERLACE_PIXEL + 1;

    /** component interlacing scheme */
    public static final int MFGR_INTERLACE_COMPONENT = MFGR_INTERLACE_PIXEL + 2;

    /** interlacing supported by the vset. */
    public static final int FULL_INTERLACE = 0;
    public static final int NO_INTERLACE = 1;

    /** unsigned char */
    public static final int DFNT_UCHAR8 = 3;
    public static final int DFNT_UCHAR = 3;

    /** char */
    public static final int DFNT_CHAR8 = 4;
    public static final int DFNT_CHAR = 4;

    /** No supported by HDF */
    public static final int DFNT_CHAR16 = 42;
    public static final int DFNT_UCHAR16 = 43;

    /** float */
    public static final int DFNT_FLOAT32 = 5;
    public static final int DFNT_FLOAT = 5;

    // ** double */
    public static final int DFNT_FLOAT64 = 6;
    public static final int DFNT_FLOAT128 = 7;
    public static final int DFNT_DOUBLE = 6;

    /** 8-bit integer */
    public static final int DFNT_INT8 = 20;

    /** unsigned 8-bit interger */
    public static final int DFNT_UINT8 = 21;

    /** short */
    public static final int DFNT_INT16 = 22;

    /** unsigned interger */
    public static final int DFNT_UINT16 = 23;

    /** interger */
    public static final int DFNT_INT32 = 24;

    /** unsigned interger */
    public static final int DFNT_UINT32 = 25;

    /** No supported */
    public static final int DFNT_INT64 = 26;
    public static final int DFNT_UINT64 = 27;
    public static final int DFNT_INT128 = 28;
    public static final int DFNT_UINT128 = 30;

    public static final int DFNT_HDF = 0x00000000;
    public static final int DFNT_NATIVE = 0x00001000;
    public static final int DFNT_CUSTOM = 0x00002000;
    public static final int DFNT_LITEND = 0x00004000;
    public static final int DFNT_MASK = 0x00000fff;

    public static final int DF_FORWARD = 1;
    public static final int DFS_MAXLEN = 255;

    public static final int COMP_NONE = 0;
    public static final int COMP_JPEG = 2;
    public static final int COMP_RLE = 11;
    public static final int COMP_IMCOMP = 12;
    public static final int COMP_CODE_NONE = 0;
    public static final int COMP_CODE_RLE = 1;
    public static final int COMP_CODE_NBIT = 2;
    public static final int COMP_CODE_SKPHUFF = 3;
    public static final int COMP_CODE_DEFLATE = 4;
    public static final int COMP_CODE_SZIP = 5;
    public static final int COMP_CODE_INVALID = 6;
    public static final int COMP_CODE_JPEG = 7;

    // Interlace schemes
    public static final int DFIL_PIXEL = 0; /* Pixel Interlacing */
    public static final int DFIL_LINE = 1; /* Scan Line Interlacing */
    public static final int DFIL_PLANE = 2; /* Scan Plane Interlacing */

    public static final int SD_UNLIMITED = 0;
    public static final int SD_FILL = 0;
    public static final int SD_NOFILL = 0x100;
    public static final int SD_DIMVAL_BW_COMP = 1;
    public static final int SD_DIMVAL_BW_INCOMP = 0;

    public static final int HDF_NONE = 0x0;
    public static final int HDF_CHUNK = 0x1;
    public static final int HDF_COMP = 0x3;
    public static final int HDF_NBIT = 0x5;
    public static final int MAX_VAR_DIMS = 32;

    // the names of the Vgroups created by the GR interface
    public static final String GR_NAME = "RIG0.0";
    public static final String RI_NAME = "RI0.0";
    public static final String RIGATTRNAME = "RIATTR0.0N";
    public static final String RIGATTRCLASS = "RIATTR0.0C";

    // names of classes of the Vdatas/Vgroups created by the SD interface
    public static final String HDF_ATTRIBUTE = "Attr0.0";
    public static final String HDF_VARIABLE = "Var0.0";
    public static final String HDF_DIMENSION = "Dim0.0";
    public static final String HDF_UDIMENSION = "UDim0.0";
    public static final String DIM_VALS = "DimVal0.0";
    public static final String DIM_VALS01 = "DimVal0.1";
    public static final String HDF_CHK_TBL = "_HDF_CHK_TBL_";
    public static final String HDF_SDSVAR = "SDSVar";
    public static final String HDF_CRDVAR = "CoordVar";

    public static final String HDF_CDF = "CDF0.0";

    // names of data object types
    public static final String ANNOTATION = "HDF_ANNOTATION";
    public static final String RI8 = "HDF_RI8";
    public static final String RI24 = "HDF_RI24";
    public static final String GR = "HDF_GR";
    public static final String SDS = "HDF_SDS";
    public static final String VDATA = "HDF_VDATA";
    public static final String VGROUP = "HDF_GROUP";

    // data types represented by Strings
    public static final String UCHAR8 = "UCHAR8";
    public static final String CHAR8 = "CHAR8";
    public static final String UCHAR16 = "UCHAR16";
    public static final String CHAR16 = "CHAR16";
    public static final String FLOAT32 = "FLOAT32";
    public static final String FLOAT64 = "FLOAT64";
    public static final String FLOAT128 = "FLOAT128";
    public static final String INT8 = "INT8";
    public static final String UINT8 = "UINT8";
    public static final String INT16 = "INT16";
    public static final String UINT16 = "UINT16";
    public static final String INT32 = "INT32";
    public static final String UINT32 = "UINT32";
    public static final String INT64 = "INT64";
    public static final String UINT64 = "UINT64";
    public static final String INT128 = "INT128";
    public static final String UINT128 = "UINT128";

    /**
     * convert number type to string type
     *
     * @param type
     *            the number representing the data type
     * @return the string representing the data type
     */
    public static String getType(int type) {
        if (type == HDFConstants.DFNT_UCHAR8) {
            return HDFConstants.UCHAR8;
        }
        else if (type == HDFConstants.DFNT_CHAR8) {
            return HDFConstants.CHAR8;
        }
        else if (type == HDFConstants.DFNT_UCHAR16) {
            return HDFConstants.UCHAR16;
        }
        else if (type == HDFConstants.DFNT_CHAR16) {
            return HDFConstants.CHAR16;
        }
        else if (type == HDFConstants.DFNT_FLOAT32) {
            return HDFConstants.FLOAT32;
        }
        else if (type == HDFConstants.DFNT_FLOAT64) {
            return HDFConstants.FLOAT64;
        }
        else if (type == HDFConstants.DFNT_FLOAT128) {
            return HDFConstants.FLOAT128;
        }
        else if (type == HDFConstants.DFNT_INT8) {
            return HDFConstants.INT8;
        }
        else if (type == HDFConstants.DFNT_UINT8) {
            return HDFConstants.UINT8;
        }
        else if (type == HDFConstants.DFNT_INT16) {
            return HDFConstants.INT16;
        }
        else if (type == HDFConstants.DFNT_UINT16) {
            return HDFConstants.UINT16;
        }
        else if (type == HDFConstants.DFNT_INT32) {
            return HDFConstants.INT32;
        }
        else if (type == HDFConstants.DFNT_UINT32) {
            return HDFConstants.UINT32;
        }
        else if (type == HDFConstants.DFNT_INT64) {
            return HDFConstants.INT64;
        }
        else if (type == HDFConstants.DFNT_UINT64) {
            return HDFConstants.UINT64;
        }
        else if (type == HDFConstants.DFNT_INT128) {
            return HDFConstants.INT128;
        }
        else if (type == HDFConstants.DFNT_UINT128) {
            return HDFConstants.UINT128;
        }
        else {
            return "Undefined Data Type";
        }
    }

    /**
     * convert string type to number type
     *
     * @param type
     *            the string representing the data type
     * @return the integer representing the data type
     */
    public static int getType(String type) {
        if (type.equalsIgnoreCase(HDFConstants.UCHAR8)) {
            return HDFConstants.DFNT_UCHAR8;
        }
        else if (type.equalsIgnoreCase(HDFConstants.CHAR8)) {
            return HDFConstants.DFNT_CHAR8;
        }
        else if (type.equalsIgnoreCase(HDFConstants.UCHAR16)) {
            return HDFConstants.DFNT_UCHAR16;
        }
        else if (type.equalsIgnoreCase(HDFConstants.CHAR16)) {
            return HDFConstants.DFNT_CHAR16;
        }
        else if (type.equalsIgnoreCase(HDFConstants.FLOAT32)) {
            return HDFConstants.DFNT_FLOAT32;
        }
        else if (type.equalsIgnoreCase(HDFConstants.FLOAT64)) {
            return HDFConstants.DFNT_FLOAT64;
        }
        else if (type.equalsIgnoreCase(HDFConstants.FLOAT128)) {
            return HDFConstants.DFNT_FLOAT128;
        }
        else if (type.equalsIgnoreCase(HDFConstants.INT8)) {
            return HDFConstants.DFNT_INT8;
        }
        else if (type.equalsIgnoreCase(HDFConstants.UINT8)) {
            return HDFConstants.DFNT_UINT8;
        }
        else if (type.equalsIgnoreCase(HDFConstants.INT16)) {
            return HDFConstants.DFNT_INT16;
        }
        else if (type.equalsIgnoreCase(HDFConstants.UINT16)) {
            return HDFConstants.DFNT_UINT16;
        }
        else if (type.equalsIgnoreCase(HDFConstants.INT32)) {
            return HDFConstants.DFNT_INT32;
        }
        else if (type.equalsIgnoreCase(HDFConstants.UINT32)) {
            return HDFConstants.DFNT_UINT32;
        }
        else if (type.equalsIgnoreCase(HDFConstants.INT64)) {
            return HDFConstants.DFNT_INT64;
        }
        else if (type.equalsIgnoreCase(HDFConstants.UINT64)) {
            return HDFConstants.DFNT_UINT64;
        }
        else if (type.equalsIgnoreCase(HDFConstants.INT128)) {
            return HDFConstants.DFNT_INT128;
        }
        else if (type.equalsIgnoreCase(HDFConstants.UINT128)) {
            return HDFConstants.DFNT_UINT128;
        }
        else {
            return -1;
        }
    }

    /**
     * gets the size of the data type in bytes, e.g size of DFNT_FLOAT32 = 4
     *
     * @param type
     *            the number representing the data type
     * @return the size of the data type
     */
    public static int getTypeSize(int type) {
        int size = 0;

        switch (type) {
            case HDFConstants.DFNT_UCHAR16:
            case HDFConstants.DFNT_CHAR16:
            case HDFConstants.DFNT_INT16:
            case HDFConstants.DFNT_UINT16:
                size = 2;
                break;
            case HDFConstants.DFNT_FLOAT32:
            case HDFConstants.DFNT_INT32:
            case HDFConstants.DFNT_UINT32:
                size = 4;
                break;
            case HDFConstants.DFNT_FLOAT64:
            case HDFConstants.DFNT_INT64:
            case HDFConstants.DFNT_UINT64:
                size = 8;
                break;
            case HDFConstants.DFNT_FLOAT128:
            case HDFConstants.DFNT_INT128:
            case HDFConstants.DFNT_UINT128:
                size = 16;
                break;
            default:
                size = 1;
                break;
        }

        return size;
    }

}
