"""Enumerators for IPP."""
from enum import IntEnum


class IppStatus(IntEnum):
    """Represent the ENUMs of a status response."""

    CUPS_INVALID = -1
    OK = 0x0000
    OK_IGNORED_OR_SUBSTITUTED = 0x0001
    OK_CONFLICTING = 0x0002
    OK_IGNORED_SUBSCRIPTIONS = 0x0003
    OK_IGNORED_NOTIFICATIONS = 0x0004
    OK_TOO_MANY_EVENTS = 0x0005
    OK_BUT_CANCEL_SUBSCRIPTION = 0x0006
    OK_EVENTS_COMPLETE = 0x0007
    REDIRECTION_OTHER_SITE = 0x0200
    CUPS_SEE_OTHER = 0x0280
    ERROR_BAD_REQUEST = 0x0400
    ERROR_FORBIDDEN = 0x0401
    ERROR_NOT_AUTHENTICATED = 0x0402
    ERROR_NOT_AUTHORIZED = 0x0403
    ERROR_NOT_POSSIBLE = 0x0404
    ERROR_TIMEOUT = 0x0405
    ERROR_NOT_FOUND = 0x0406
    ERROR_GONE = 0x0407
    ERROR_REQUEST_ENTITY = 0x0408
    ERROR_REQUEST_VALUE = 0x0409
    ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED = 0x040A
    ERROR_ATTRIBUTES_OR_VALUES = 0x040B
    ERROR_URI_SCHEME = 0x040C
    ERROR_CHARSET = 0x040D
    ERROR_CONFLICTING = 0x040E
    ERROR_COMPRESSION_ERROR = 0x040F
    ERROR_DOCUMENT_FORMAT_ERROR = 0x0410
    ERROR_DOCUMENT_ACCESS = 0x0411
    ERROR_ATTRIBUTES_NOT_SETTABLE = 0x0412
    ERROR_IGNORED_ALL_SUBSCRIPTIONS = 0x0413
    ERROR_TOO_MANY_SUBSCRIPTIONS = 0x0414
    ERROR_IGNORED_ALL_NOTIFICATIONS = 0x0415
    ERROR_PRINT_SUPPORT_FILE_NOT_FOUND = 0x0416
    ERROR_DOCUMENT_PASSWORD = 0x0417
    ERROR_DOCUMENT_PERMISSION = 0x0418
    ERROR_DOCUMENT_SECURITY = 0x0419
    ERROR_DOCUMENT_UNPRINTABLE = 0x041A
    ERROR_ACCOUNT_INFO_NEEDED = 0x041B
    ERROR_ACCOUNT_CLOSED = 0x041C
    ERROR_ACCOUNT_LIMIT_REACHED = 0x041D
    ERROR_ACCOUNT_AUTHORIZATION_FAILED = 0x041E
    ERROR_NOT_FETCHABLE = 0x041F
    ERROR_CUPS_ACCOUNT_INFO_NEEDED = 0x049C
    ERROR_CUPS_ACCOUNT_CLOSED = 0x049D
    ERROR_CUPS_ACCOUNT_LIMIT_REACHED = 0x049E
    ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED = 0x049F
    ERROR_INTERNAL = 0x0500
    ERROR_OPERATION_NOT_SUPPORTED = 0x0501
    ERROR_SERVICE_UNAVAILABLE = 0x0502
    ERROR_VERSION_NOT_SUPPORTED = 0x0503
    ERROR_DEVICE = 0x0504
    ERROR_TEMPORARY = 0x0505
    ERROR_NOT_ACCEPTING_JOBS = 0x0506
    ERROR_BUSY = 0x0507
    ERROR_JOB_CANCELED = 0x0508
    ERROR_MULTIPLE_JOBS_NOT_SUPPORTED = 0x0509
    ERROR_PRINTER_IS_DEACTIVATED = 0x050A
    ERROR_TOO_MANY_JOBS = 0x050B
    ERROR_TOO_MANY_DOCUMENTS = 0x050C
    ERROR_CUPS_AUTHENTICATION_CANCELED = 0x1000
    ERROR_CUPS_PKI = 0x1001
    ERROR_CUPS_UPGRADE_REQUIRED = 0x1002


class IppOperation(IntEnum):
    """Represent the ENUMs of an operation."""

    CUPS_INVALID = -0x0001
    CUPS_NONE = 0x0000
    PRINT_JOB = 0x0002
    PRINT_URI = 0x0003
    VALIDATE_JOB = 0x0004
    CREATE_JOB = 0x0005
    SEND_DOCUMENT = 0x0006
    SEND_URI = 0x0007
    CANCEL_JOB = 0x0008
    GET_JOB_ATTRIBUTES = 0x0009
    GET_JOBS = 0x000A
    GET_PRINTER_ATTRIBUTES = 0x000B
    HOLD_JOB = 0x000C
    RELEASE_JOB = 0x000D
    RESTART_JOB = 0x000E
    PAUSE_PRINTER = 0x0010
    RESUME_PRINTER = 0x0011
    PURGE_JOBS = 0x0012
    SET_PRINTER_ATTRIBUTES = 0x0013
    SET_JOB_ATTRIBUTES = 0x0014
    GET_PRINTER_SUPPORTED_VALUES = 0x0015
    CREATE_PRINTER_SUBSCRIPTIONS = 0x0016
    CREATE_JOB_SUBSCRIPTIONS = 0x0017
    GET_SUBSCRIPTION_ATTRIBUTES = 0x0018
    GET_SUBSCRIPTIONS = 0x0019
    RENEW_SUBSCRIPTION = 0x001A
    CANCEL_SUBSCRIPTION = 0x001B
    GET_NOTIFICATIONS = 0x001C
    SEND_NOTIFICATIONS = 0x001D
    GET_RESOURCE_ATTRIBUTES = 0x001E
    GET_RESOURCE_DATA = 0x001F
    GET_RESOURCES = 0x0020
    GET_PRINT_SUPPORT_FILES = 0x0021
    ENABLE_PRINTER = 0x0022
    DISABLE_PRINTER = 0x0023
    PAUSE_PRINTER_AFTER_CURRENT_JOB = 0x0024
    HOLD_NEW_JOBS = 0x0025
    RELEASE_HELD_NEW_JOBS = 0x0026
    DEACTIVATE_PRINTER = 0x0027
    ACTIVATE_PRINTER = 0x0028
    RESTART_PRINTER = 0x0029
    SHUTDOWN_PRINTER = 0x002A
    STARTUP_PRINTER = 0x002B
    REPROCESS_JOB = 0x002C
    CANCEL_CURRENT_JOB = 0x002D
    SUSPEND_CURRENT_JOB = 0x002E
    RESUME_JOB = 0x002F
    PROMOTE_JOB = 0x0030
    SCHEDULE_JOB_AFTER = 0x0031
    CANCEL_DOCUMENT = 0x0033
    GET_DOCUMENT_ATTRIBUTES = 0x0034
    GET_DOCUMENTS = 0x0035
    DELETE_DOCUMENT = 0x0036
    SET_DOCUMENT_ATTRIBUTES = 0x0037
    CANCEL_JOBS = 0x0038
    CANCEL_MY_JOBS = 0x0039
    RESUBMIT_JOB = 0x003A
    CLOSE_JOB = 0x003B
    IDENTIFY_PRINTER = 0x003C
    VALIDATE_DOCUMENT = 0x003D
    ADD_DOCUMENT_IMAGES = 0x003E
    ACKNOWLEDGE_DOCUMENT = 0x003F
    ACKNOWLEDGE_IDENTIFY_PRINTER = 0x0040
    ACKNOWLEDGE_JOB = 0x0041
    FETCH_DOCUMENT = 0x0042
    FETCH_JOB = 0x0043
    GET_OUTPUT_DEVICE_ATTRIBUTES = 0x0044
    UPDATE_ACTIVE_JOBS = 0x0045
    DEREGISTER_OUTPUT_DEVICE = 0x0046
    UPDATE_DOCUMENT_STATUS = 0x0047
    UPDATE_JOB_STATUS = 0x0048
    UPDATE_OUTPUT_DEVICE_ATTRIBUTES = 0x0049
    GET_NEXT_DOCUMENT_DATA = 0x004A
    ALLOCATE_PRINTER_RESOURCES = 0x004B
    CREATE_PRINTER = 0x004C
    DEALLOCATE_PRINTER_RESOURCES = 0x004D
    DELETE_PRINTER = 0x004E
    GET_PRINTERS = 0x004F
    SHUTDOWN_ONE_PRINTER = 0x0050
    STARTUP_ONE_PRINTER = 0x0051
    CANCEL_RESOURCE = 0x0052
    CREATE_RESOURCE = 0x0053
    INSTALL_RESOURCE = 0x0054
    SEND_RESOURCE_DATA = 0x0055
    SET_RESOURCE_ATTRIBUTES = 0x0056
    CREATE_RESOURCE_SUBSCRIPTIONS = 0x0057
    CREATE_SYSTEM_SUBSCRIPTIONS = 0x0058
    DISABLE_ALL_PRINTERS = 0x0059
    ENABLE_ALL_PRINTERS = 0x005A
    GET_SYSTEM_ATTRIBUTES = 0x005B
    GET_SYSTEM_SUPPORTED_VALUES = 0x005C
    PAUSE_ALL_PRINTERS = 0x005D
    PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB = 0x005E
    REGISTER_OUTPUT_DEVICE = 0x005F
    RESTART_SYSTEM = 0x0060
    RESUME_ALL_PRINTERS = 0x0061
    SET_SYSTEM_ATTRIBUTES = 0x0062
    SHUTDOWN_ALL_PRINTER = 0x0063
    STARTUP_ALL_PRINTERS = 0x0064
    PRIVATE = 0x4000
    CUPS_GET_DEFAULT = 0x4001
    CUPS_GET_PRINTERS = 0x4002
    CUPS_ADD_MODIFY_PRINTER = 0x4003
    CUPS_DELETE_PRINTER = 0x4004
    CUPS_GET_CLASSES = 0x4005
    CUPS_ADD_MODIFY_CLASS = 0x4006
    CUPS_DELETE_CLASS = 0x4007
    CUPS_ACCEPT_JOBS = 0x4008
    CUPS_REJECT_JOBS = 0x4009
    CUPS_SET_DEFAULT = 0x400A
    CUPS_GET_DEVICES = 0x400B
    CUPS_GET_PPDS = 0x400C
    CUPS_MOVE_JOB = 0x400D
    CUPS_AUTHENTICATE_JOB = 0x400E
    CUPS_GET_PPD = 0x400F
    CUPS_GET_DOCUMENT = 0x4027
    CUPS_CREATE_LOCAL_PRINTER = 0x4028


class IppTag(IntEnum):
    """Represent the ENUMs of a tag."""

    CUPS_INVALID = -1
    ZERO = 0x00
    OPERATION = 0x01
    JOB = 0x02
    END = 0x03
    PRINTER = 0x04
    UNSUPPORTED_GROUP = 0x05
    SUBSCRIPTION = 0x06
    EVENT_NOTIFICATION = 0x07
    RESOURCE = 0x08
    DOCUMENT = 0x09
    SYSTEM = 0x0A
    UNSUPPORTED_VALUE = 0x10
    DEFAULT = 0x11
    UNKNOWN = 0x12
    NO_VALUE = 0x013
    NOT_SETTABLE = 0x15
    DELETE_ATTR = 0x16
    ADMIN_DEFINE = 0x17
    INTEGER = 0x21
    BOOLEAN = 0x22
    ENUM = 0x23
    STRING = 0x30
    DATE = 0x31
    RESOLUTION = 0x32
    RANGE = 0x33
    BEGIN_COLLECTION = 0x34
    TEXT_LANG = 0x35
    NAME_LANG = 0x36
    END_COLLECTION = 0x37
    TEXT = 0x41
    NAME = 0x42
    RESERVED_STRING = 0x43
    KEYWORD = 0x44
    URI = 0x45
    URI_SCHEME = 0x46
    CHARSET = 0x47
    LANGUAGE = 0x48
    MIME_TYPE = 0x49
    MEMBER_NAME = 0x4A
    EXTENSION = 0x7F
    CUPS_MASK = 0x7FFFFFFF
    CUPS_CONST = -0x7FFFFFFF - 1


class IppJobState(IntEnum):
    """Represent the ENUMs of the state of a print job."""

    PENDING = 0x03
    HELD = 0x04
    PROCESSING = 0x05
    STOPPED = 0x06
    CANCELED = 0x07
    ABORTED = 0x08
    COMPLETED = 0x09


class IppDocumentState(IntEnum):
    """Represent the ENUMs of the state of a document."""

    PENDING = 0x03
    PROCESSING = 0x05
    CANCELED = 0x07
    ABORTED = 0x08
    COMPLETED = 0x08


class IppPrinterState(IntEnum):
    """Represent the ENUMs of the state of a printer."""

    IDLE = 0x0003
    PROCESSING = 0x0004
    STOPPED = 0x0005


class IppFinishing(IntEnum):
    """Represent the ENUMs of the finishings attribute."""

    NONE = 0x0003
    STAPLE = 0x0004
    PUNCH = 0x0005
    COVER = 0x0006
    BIND = 0x0007
    SADDLE_STITCH = 0x0008
    EDGE_STITCH = 0x0009
    STAPLE_TOP_LEFT = 0x0014
    STAPLE_BOTTOM_LEFT = 0x0015
    STAPLE_TOP_RIGHT = 0x0016
    STAPLE_BOTTOM_RIGHT = 0x0017
    EDGE_STITCH_LEFT = 0x0018
    EDGE_STITCH_TOP = 0x0019
    EDGE_STITCH_RIGHT = 0x001A
    EDGE_STITCH_BOTTOM = 0x001B
    STAPLE_DUAL_LEFT = 0x001C
    STAPLE_DUAL_TOP = 0x001D
    STAPLE_DUAL_RIGHT = 0x001E
    STAPLE_DUAL_BOTTOM = 0x001F


class IppPrintQuality(IntEnum):
    """Represent the ENUMs of the print-quality attribute."""

    DRAFT = 0x0003
    NORMAL = 0x0004
    HIGH = 0x0005


class IppOrientationRequested(IntEnum):
    """Represent the ENUMs of the orientation-requested attribute."""

    PORTRAIT = 0x0003
    LANDSCAPE = 0x0004
    REVERSE_LANDSCAPE = 0x0005
    REVERSE_PORTRAIT = 0x0006


ATTRIBUTE_ENUM_MAP = {
    "document-state": IppDocumentState, # PWG5100.5
    "finishings": IppFinishing, # RFC8011
    "finishings-default": IppFinishing, # RFC8011
    "finishings-supported": IppFinishing, # RFC8011
    "job-state": IppJobState, # RFC8011
    "media-source-feed-orientation": IppOrientationRequested, # PWG5100.7
    "operations-supported": IppOperation, # RFC8011
    "orientation-requested": IppOrientationRequested, # RFC8011
    "orientation-requested-default": IppOrientationRequested, # RFC8011
    "orientation-requested-supported": IppOrientationRequested, # RFC8011
    "printer-state": IppPrinterState, # RFC8011
    "print-quality": IppPrintQuality, # RFC8011
    "print-quality-default": IppPrintQuality, # RFC8011
    "print-quality-supported": IppPrintQuality, # RFC8011
    "status-code": IppStatus, # RFC8011
}
