# type: ignore

import enum
import os
import comtypes.client

# Get IAccessible2 constants for helper functions below
ia2_tlb = os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    "ia2_api_all.tlb",
)
ia2_mod = comtypes.client.GetModule(ia2_tlb)
# Add to globals the many IAccessible2 constants. These will also be imported
# when this file is imported.
globals().update((k, getattr(ia2_mod, k)) for k in ia2_mod.__all__)


class Role(enum.IntEnum):
    # MSAA roles - constants not provided via oleacc
    ROLE_SYSTEM_TITLEBAR = 1
    ROLE_SYSTEM_MENUBAR = 2
    ROLE_SYSTEM_SCROLLBAR = 3
    ROLE_SYSTEM_GRIP = 4
    ROLE_SYSTEM_SOUND = 5
    ROLE_SYSTEM_CURSOR = 6
    ROLE_SYSTEM_CARET = 7
    ROLE_SYSTEM_ALERT = 8
    ROLE_SYSTEM_WINDOW = 9
    ROLE_SYSTEM_CLIENT = 10
    ROLE_SYSTEM_MENUPOPUP = 11
    ROLE_SYSTEM_MENUITEM = 12
    ROLE_SYSTEM_TOOLTIP = 13
    ROLE_SYSTEM_APPLICATION = 14
    ROLE_SYSTEM_DOCUMENT = 15
    ROLE_SYSTEM_PANE = 16
    ROLE_SYSTEM_CHART = 17
    ROLE_SYSTEM_DIALOG = 18
    ROLE_SYSTEM_BORDER = 19
    ROLE_SYSTEM_GROUPING = 20
    ROLE_SYSTEM_SEPARATOR = 21
    ROLE_SYSTEM_TOOLBAR = 22
    ROLE_SYSTEM_STATUSBAR = 23
    ROLE_SYSTEM_TABLE = 24
    ROLE_SYSTEM_COLUMNHEADER = 25
    ROLE_SYSTEM_ROWHEADER = 26
    ROLE_SYSTEM_COLUMN = 27
    ROLE_SYSTEM_ROW = 28
    ROLE_SYSTEM_CELL = 29
    ROLE_SYSTEM_LINK = 30
    ROLE_SYSTEM_HELPBALLOON = 31
    ROLE_SYSTEM_CHARACTER = 32
    ROLE_SYSTEM_LIST = 33
    ROLE_SYSTEM_LISTITEM = 34
    ROLE_SYSTEM_OUTLINE = 35
    ROLE_SYSTEM_OUTLINEITEM = 36
    ROLE_SYSTEM_PAGETAB = 37
    ROLE_SYSTEM_PROPERTYPAGE = 38
    ROLE_SYSTEM_INDICATOR = 39
    ROLE_SYSTEM_GRAPHIC = 40
    ROLE_SYSTEM_STATICTEXT = 41
    ROLE_SYSTEM_TEXT = 42
    ROLE_SYSTEM_PUSHBUTTON = 43
    ROLE_SYSTEM_CHECKBUTTON = 44
    ROLE_SYSTEM_RADIOBUTTON = 45
    ROLE_SYSTEM_COMBOBOX = 46
    ROLE_SYSTEM_DROPLIST = 47
    ROLE_SYSTEM_PROGRESSBAR = 48
    ROLE_SYSTEM_DIAL = 49
    ROLE_SYSTEM_HOTKEYFIELD = 50
    ROLE_SYSTEM_SLIDER = 51
    ROLE_SYSTEM_SPINBUTTON = 52
    ROLE_SYSTEM_DIAGRAM = 53
    ROLE_SYSTEM_ANIMATION = 54
    ROLE_SYSTEM_EQUATION = 55
    ROLE_SYSTEM_BUTTONDROPDOWN = 56
    ROLE_SYSTEM_BUTTONMENU = 57
    ROLE_SYSTEM_BUTTONDROPDOWNGRID = 58
    ROLE_SYSTEM_WHITESPACE = 59
    ROLE_SYSTEM_PAGETABLIST = 60
    ROLE_SYSTEM_CLOCK = 61
    ROLE_SYSTEM_SPLITBUTTON = 62
    ROLE_SYSTEM_IPADDRESS = 63
    ROLE_SYSTEM_OUTLINEBUTTON = 64
    # IAccessible2 roles
    IA2_ROLE_CANVAS = ia2_mod.IA2_ROLE_CANVAS
    IA2_ROLE_CAPTION = ia2_mod.IA2_ROLE_CAPTION
    IA2_ROLE_CHECK_MENU_ITEM = ia2_mod.IA2_ROLE_CHECK_MENU_ITEM
    IA2_ROLE_COLOR_CHOOSER = ia2_mod.IA2_ROLE_COLOR_CHOOSER
    IA2_ROLE_DATE_EDITOR = ia2_mod.IA2_ROLE_DATE_EDITOR
    IA2_ROLE_DESKTOP_ICON = ia2_mod.IA2_ROLE_DESKTOP_ICON
    IA2_ROLE_DESKTOP_PANE = ia2_mod.IA2_ROLE_DESKTOP_PANE
    IA2_ROLE_DIRECTORY_PANE = ia2_mod.IA2_ROLE_DIRECTORY_PANE
    IA2_ROLE_EDITBAR = ia2_mod.IA2_ROLE_EDITBAR
    IA2_ROLE_EMBEDDED_OBJECT = ia2_mod.IA2_ROLE_EMBEDDED_OBJECT
    IA2_ROLE_ENDNOTE = ia2_mod.IA2_ROLE_ENDNOTE
    IA2_ROLE_FILE_CHOOSER = ia2_mod.IA2_ROLE_FILE_CHOOSER
    IA2_ROLE_FONT_CHOOSER = ia2_mod.IA2_ROLE_FONT_CHOOSER
    IA2_ROLE_FOOTER = ia2_mod.IA2_ROLE_FOOTER
    IA2_ROLE_FOOTNOTE = ia2_mod.IA2_ROLE_FOOTNOTE
    IA2_ROLE_FORM = ia2_mod.IA2_ROLE_FORM
    IA2_ROLE_FRAME = ia2_mod.IA2_ROLE_FRAME
    IA2_ROLE_GLASS_PANE = ia2_mod.IA2_ROLE_GLASS_PANE
    IA2_ROLE_HEADER = ia2_mod.IA2_ROLE_HEADER
    IA2_ROLE_HEADING = ia2_mod.IA2_ROLE_HEADING
    IA2_ROLE_ICON = ia2_mod.IA2_ROLE_ICON
    IA2_ROLE_IMAGE_MAP = ia2_mod.IA2_ROLE_IMAGE_MAP
    IA2_ROLE_INPUT_METHOD_WINDOW = ia2_mod.IA2_ROLE_INPUT_METHOD_WINDOW
    IA2_ROLE_INTERNAL_FRAME = ia2_mod.IA2_ROLE_INTERNAL_FRAME
    IA2_ROLE_LABEL = ia2_mod.IA2_ROLE_LABEL
    IA2_ROLE_LAYERED_PANE = ia2_mod.IA2_ROLE_LAYERED_PANE
    IA2_ROLE_NOTE = ia2_mod.IA2_ROLE_NOTE
    IA2_ROLE_OPTION_PANE = ia2_mod.IA2_ROLE_OPTION_PANE
    IA2_ROLE_PAGE = ia2_mod.IA2_ROLE_PAGE
    IA2_ROLE_PARAGRAPH = ia2_mod.IA2_ROLE_PARAGRAPH
    IA2_ROLE_RADIO_MENU_ITEM = ia2_mod.IA2_ROLE_RADIO_MENU_ITEM
    IA2_ROLE_REDUNDANT_OBJECT = ia2_mod.IA2_ROLE_REDUNDANT_OBJECT
    IA2_ROLE_ROOT_PANE = ia2_mod.IA2_ROLE_ROOT_PANE
    IA2_ROLE_RULER = ia2_mod.IA2_ROLE_RULER
    IA2_ROLE_SCROLL_PANE = ia2_mod.IA2_ROLE_SCROLL_PANE
    IA2_ROLE_SECTION = ia2_mod.IA2_ROLE_SECTION
    IA2_ROLE_SHAPE = ia2_mod.IA2_ROLE_SHAPE
    IA2_ROLE_SPLIT_PANE = ia2_mod.IA2_ROLE_SPLIT_PANE
    IA2_ROLE_TEAR_OFF_MENU = ia2_mod.IA2_ROLE_TEAR_OFF_MENU
    IA2_ROLE_TERMINAL = ia2_mod.IA2_ROLE_TERMINAL
    IA2_ROLE_TEXT_FRAME = ia2_mod.IA2_ROLE_TEXT_FRAME
    IA2_ROLE_TOGGLE_BUTTON = ia2_mod.IA2_ROLE_TOGGLE_BUTTON
    IA2_ROLE_UNKNOWN = ia2_mod.IA2_ROLE_UNKNOWN
    IA2_ROLE_VIEW_PORT = ia2_mod.IA2_ROLE_VIEW_PORT
    IA2_ROLE_COMPLEMENTARY_CONTENT = ia2_mod.IA2_ROLE_COMPLEMENTARY_CONTENT
    IA2_ROLE_LANDMARK = ia2_mod.IA2_ROLE_LANDMARK
    IA2_ROLE_LEVEL_BAR = ia2_mod.IA2_ROLE_LEVEL_BAR
    IA2_ROLE_CONTENT_DELETION = ia2_mod.IA2_ROLE_CONTENT_DELETION
    IA2_ROLE_CONTENT_INSERTION = ia2_mod.IA2_ROLE_CONTENT_INSERTION
    IA2_ROLE_BLOCK_QUOTE = ia2_mod.IA2_ROLE_BLOCK_QUOTE
    IA2_ROLE_MARK = ia2_mod.IA2_ROLE_MARK
    IA2_ROLE_SUGGESTION = ia2_mod.IA2_ROLE_SUGGESTION
    IA2_ROLE_COMMENT = ia2_mod.IA2_ROLE_COMMENT


class MsaaState(enum.IntFlag):
    STATE_SYSTEM_UNAVAILABLE = 0x00000001
    STATE_SYSTEM_SELECTED = 0x00000002
    STATE_SYSTEM_FOCUSED = 0x00000004
    STATE_SYSTEM_PRESSED = 0x00000008
    STATE_SYSTEM_CHECKED = 0x00000010
    STATE_SYSTEM_MIXED = 0x00000020
    STATE_SYSTEM_READONLY = 0x00000040
    STATE_SYSTEM_HOTTRACKED = 0x00000080
    STATE_SYSTEM_DEFAULT = 0x00000100
    STATE_SYSTEM_EXPANDED = 0x00000200
    STATE_SYSTEM_COLLAPSED = 0x00000400
    STATE_SYSTEM_BUSY = 0x00000800
    STATE_SYSTEM_FLOATING = 0x00001000
    STATE_SYSTEM_MARQUEED = 0x00002000
    STATE_SYSTEM_ANIMATED = 0x00004000
    STATE_SYSTEM_INVISIBLE = 0x00008000
    STATE_SYSTEM_OFFSCREEN = 0x00010000
    STATE_SYSTEM_SIZEABLE = 0x00020000
    STATE_SYSTEM_MOVEABLE = 0x00040000
    STATE_SYSTEM_SELFVOICING = 0x00080000
    STATE_SYSTEM_FOCUSABLE = 0x00100000
    STATE_SYSTEM_SELECTABLE = 0x00200000
    STATE_SYSTEM_LINKED = 0x00400000
    STATE_SYSTEM_TRAVERSED = 0x00800000
    STATE_SYSTEM_MULTISELECTABLE = 0x01000000
    STATE_SYSTEM_EXTSELECTABLE = 0x02000000
    STATE_SYSTEM_ALERT_LOW = 0x04000000
    STATE_SYSTEM_ALERT_MEDIUM = 0x08000000
    STATE_SYSTEM_ALERT_HIGH = 0x10000000
    STATE_SYSTEM_PROTECTED = 0x20000000
    STATE_SYSTEM_HASPOPUP = 0x40000000


class Ia2State(enum.IntFlag):
    IA2_STATE_ACTIVE = ia2_mod.IA2_STATE_ACTIVE
    IA2_STATE_ARMED = ia2_mod.IA2_STATE_ARMED
    IA2_STATE_CHECKABLE = ia2_mod.IA2_STATE_CHECKABLE
    IA2_STATE_DEFUNCT = ia2_mod.IA2_STATE_DEFUNCT
    IA2_STATE_EDITABLE = ia2_mod.IA2_STATE_EDITABLE
    IA2_STATE_HORIZONTAL = ia2_mod.IA2_STATE_HORIZONTAL
    IA2_STATE_ICONIFIED = ia2_mod.IA2_STATE_ICONIFIED
    IA2_STATE_INVALID_ENTRY = ia2_mod.IA2_STATE_INVALID_ENTRY
    IA2_STATE_MANAGES_DESCENDANTS = ia2_mod.IA2_STATE_MANAGES_DESCENDANTS
    IA2_STATE_MODAL = ia2_mod.IA2_STATE_MODAL
    IA2_STATE_MULTI_LINE = ia2_mod.IA2_STATE_MULTI_LINE
    IA2_STATE_OPAQUE = ia2_mod.IA2_STATE_OPAQUE
    IA2_STATE_PINNED = ia2_mod.IA2_STATE_PINNED
    IA2_STATE_REQUIRED = ia2_mod.IA2_STATE_REQUIRED
    IA2_STATE_SELECTABLE_TEXT = ia2_mod.IA2_STATE_SELECTABLE_TEXT
    IA2_STATE_SINGLE_LINE = ia2_mod.IA2_STATE_SINGLE_LINE
    IA2_STATE_STALE = ia2_mod.IA2_STATE_STALE
    IA2_STATE_SUPPORTS_AUTOCOMPLETION = ia2_mod.IA2_STATE_SUPPORTS_AUTOCOMPLETION
    IA2_STATE_TRANSIENT = ia2_mod.IA2_STATE_TRANSIENT
    IA2_STATE_VERTICAL = ia2_mod.IA2_STATE_VERTICAL


def msaa_state_list_to_string(states):
    state_strings = []
    for state in MsaaState:
        if states & state:
            state_strings.append(state.name.removeprefix("STATE_SYSTEM_"))
    return state_strings


def state_list_to_string(states):
    state_strings = []
    for state in Ia2State:
        if states & state:
            state_strings.append(state.name.removeprefix("IA2_STATE_"))
    return state_strings
