"""
GDAL - Constant definitions
"""

from ctypes import (
    c_double,
    c_float,
    c_int8,
    c_int16,
    c_int32,
    c_int64,
    c_ubyte,
    c_uint16,
    c_uint32,
    c_uint64,
)

# See https://gdal.org/api/raster_c_api.html#_CPPv412GDALDataType
GDAL_PIXEL_TYPES = {
    0: "GDT_Unknown",  # Unknown or unspecified type
    1: "GDT_Byte",  # Eight bit unsigned integer
    2: "GDT_UInt16",  # Sixteen bit unsigned integer
    3: "GDT_Int16",  # Sixteen bit signed integer
    4: "GDT_UInt32",  # Thirty-two bit unsigned integer
    5: "GDT_Int32",  # Thirty-two bit signed integer
    6: "GDT_Float32",  # Thirty-two bit floating point
    7: "GDT_Float64",  # Sixty-four bit floating point
    8: "GDT_CInt16",  # Complex Int16
    9: "GDT_CInt32",  # Complex Int32
    10: "GDT_CFloat32",  # Complex Float32
    11: "GDT_CFloat64",  # Complex Float64
    12: "GDT_UInt64",  # 64 bit unsigned integer (GDAL 3.5+).
    13: "GDT_Int64",  # 64 bit signed integer (GDAL 3.5+).
    14: "GDT_Int8",  # 8 bit signed integer (GDAL 3.7+).
}

# A list of gdal datatypes that are integers.
GDAL_INTEGER_TYPES = [1, 2, 3, 4, 5, 12, 13, 14]

# Lookup values to convert GDAL pixel type indices into ctypes objects.
# The GDAL band-io works with ctypes arrays to hold data to be written
# or to hold the space for data to be read into. The lookup below helps
# selecting the right ctypes object for a given gdal pixel type.
GDAL_TO_CTYPES = [
    None,
    c_ubyte,
    c_uint16,
    c_int16,
    c_uint32,
    c_int32,
    c_float,
    c_double,
    None,
    None,
    None,
    None,
    c_uint64,
    c_int64,
    c_int8,
]

# List of resampling algorithms that can be used to warp a GDALRaster.
GDAL_RESAMPLE_ALGORITHMS = {
    "NearestNeighbour": 0,
    "Bilinear": 1,
    "Cubic": 2,
    "CubicSpline": 3,
    "Lanczos": 4,
    "Average": 5,
    "Mode": 6,
}

# See https://gdal.org/api/raster_c_api.html#_CPPv415GDALColorInterp
GDAL_COLOR_TYPES = {
    0: "GCI_Undefined",  # Undefined, default value, i.e. not known
    1: "GCI_GrayIndex",  # Grayscale
    2: "GCI_PaletteIndex",  # Paletted
    3: "GCI_RedBand",  # Red band of RGBA image
    4: "GCI_GreenBand",  # Green band of RGBA image
    5: "GCI_BlueBand",  # Blue band of RGBA image
    6: "GCI_AlphaBand",  # Alpha (0=transparent, 255=opaque)
    7: "GCI_HueBand",  # Hue band of HLS image
    8: "GCI_SaturationBand",  # Saturation band of HLS image
    9: "GCI_LightnessBand",  # Lightness band of HLS image
    10: "GCI_CyanBand",  # Cyan band of CMYK image
    11: "GCI_MagentaBand",  # Magenta band of CMYK image
    12: "GCI_YellowBand",  # Yellow band of CMYK image
    13: "GCI_BlackBand",  # Black band of CMLY image
    14: "GCI_YCbCr_YBand",  # Y Luminance
    15: "GCI_YCbCr_CbBand",  # Cb Chroma
    16: "GCI_YCbCr_CrBand",  # Cr Chroma, also GCI_Max
}

# GDAL virtual filesystems prefix.
VSI_FILESYSTEM_PREFIX = "/vsi"

# Fixed base path for buffer-based GDAL in-memory files.
VSI_MEM_FILESYSTEM_BASE_PATH = "/vsimem/"

# Should the memory file system take ownership of the buffer, freeing it when
# the file is deleted? (No, GDALRaster.__del__() will delete the buffer.)
VSI_TAKE_BUFFER_OWNERSHIP = False

# Should a VSI file be removed when retrieving its buffer?
VSI_DELETE_BUFFER_ON_READ = False
