# encoding: utf-8

"""
Constants specific the the image sub-package
"""


class JPEG_MARKER_CODE(object):
    """
    JPEG marker codes
    """
    TEM = b'\x01'
    DHT = b'\xC4'
    DAC = b'\xCC'
    JPG = b'\xC8'

    SOF0 = b'\xC0'
    SOF1 = b'\xC1'
    SOF2 = b'\xC2'
    SOF3 = b'\xC3'
    SOF5 = b'\xC5'
    SOF6 = b'\xC6'
    SOF7 = b'\xC7'
    SOF9 = b'\xC9'
    SOFA = b'\xCA'
    SOFB = b'\xCB'
    SOFD = b'\xCD'
    SOFE = b'\xCE'
    SOFF = b'\xCF'

    RST0 = b'\xD0'
    RST1 = b'\xD1'
    RST2 = b'\xD2'
    RST3 = b'\xD3'
    RST4 = b'\xD4'
    RST5 = b'\xD5'
    RST6 = b'\xD6'
    RST7 = b'\xD7'

    SOI = b'\xD8'
    EOI = b'\xD9'
    SOS = b'\xDA'
    DQT = b'\xDB'  # Define Quantization Table(s)
    DNL = b'\xDC'
    DRI = b'\xDD'
    DHP = b'\xDE'
    EXP = b'\xDF'

    APP0 = b'\xE0'
    APP1 = b'\xE1'
    APP2 = b'\xE2'
    APP3 = b'\xE3'
    APP4 = b'\xE4'
    APP5 = b'\xE5'
    APP6 = b'\xE6'
    APP7 = b'\xE7'
    APP8 = b'\xE8'
    APP9 = b'\xE9'
    APPA = b'\xEA'
    APPB = b'\xEB'
    APPC = b'\xEC'
    APPD = b'\xED'
    APPE = b'\xEE'
    APPF = b'\xEF'

    STANDALONE_MARKERS = (
        TEM, SOI, EOI, RST0, RST1, RST2, RST3, RST4, RST5, RST6, RST7
    )

    SOF_MARKER_CODES = (
        SOF0, SOF1, SOF2, SOF3, SOF5, SOF6, SOF7, SOF9, SOFA, SOFB, SOFD,
        SOFE, SOFF
    )

    marker_names = {
        b'\x00': 'UNKNOWN',
        b'\xC0': 'SOF0',
        b'\xC2': 'SOF2',
        b'\xC4': 'DHT',
        b'\xDA': 'SOS',   # start of scan
        b'\xD8': 'SOI',   # start of image
        b'\xD9': 'EOI',   # end of image
        b'\xDB': 'DQT',
        b'\xE0': 'APP0',
        b'\xE1': 'APP1',
        b'\xE2': 'APP2',
        b'\xED': 'APP13',
        b'\xEE': 'APP14',
    }

    @classmethod
    def is_standalone(cls, marker_code):
        return marker_code in cls.STANDALONE_MARKERS


class MIME_TYPE(object):
    """
    Image content types
    """
    BMP = 'image/bmp'
    GIF = 'image/gif'
    JPEG = 'image/jpeg'
    PNG = 'image/png'
    TIFF = 'image/tiff'


class PNG_CHUNK_TYPE(object):
    """
    PNG chunk type names
    """
    IHDR = 'IHDR'
    pHYs = 'pHYs'
    IEND = 'IEND'


class TIFF_FLD_TYPE(object):
    """
    Tag codes for TIFF Image File Directory (IFD) entries.
    """
    BYTE = 1
    ASCII = 2
    SHORT = 3
    LONG = 4
    RATIONAL = 5

    field_type_names = {
        1: 'BYTE', 2: 'ASCII char', 3: 'SHORT', 4: 'LONG',
        5: 'RATIONAL'
    }


TIFF_FLD = TIFF_FLD_TYPE


class TIFF_TAG(object):
    """
    Tag codes for TIFF Image File Directory (IFD) entries.
    """
    IMAGE_WIDTH = 0x0100
    IMAGE_LENGTH = 0x0101
    X_RESOLUTION = 0x011A
    Y_RESOLUTION = 0x011B
    RESOLUTION_UNIT = 0x0128

    tag_names = {
        0x00FE: 'NewSubfileType',
        0x0100: 'ImageWidth',
        0x0101: 'ImageLength',
        0x0102: 'BitsPerSample',
        0x0103: 'Compression',
        0x0106: 'PhotometricInterpretation',
        0x010E: 'ImageDescription',
        0x010F: 'Make',
        0x0110: 'Model',
        0x0111: 'StripOffsets',
        0x0112: 'Orientation',
        0x0115: 'SamplesPerPixel',
        0x0117: 'StripByteCounts',
        0x011A: 'XResolution',
        0x011B: 'YResolution',
        0x011C: 'PlanarConfiguration',
        0x0128: 'ResolutionUnit',
        0x0131: 'Software',
        0x0132: 'DateTime',
        0x0213: 'YCbCrPositioning',
        0x8769: 'ExifTag',
        0x8825: 'GPS IFD',
        0xC4A5: 'PrintImageMatching',
    }
