import obspython as obs
# pip install pywin32
import win32com.client

powerpoint = None
hotkey_id_frst = None
hotkey_id_prev = None
hotkey_id_next = None
hotkey_id_last = None

HOTKEY_NAME_FRST = 'powerpoint_slides.first'
HOTKEY_NAME_PREV = 'powerpoint_slides.previous'
HOTKEY_NAME_NEXT = 'powerpoint_slides.next'
HOTKEY_NAME_LAST = 'powerpoint_slides.last'

HOTKEY_DESC_FRST = 'Go to the first slide of active Powerpoint Presentation.'
HOTKEY_DESC_PREV = 'Go to the previous slide of active Powerpoint Presentation.'
HOTKEY_DESC_NEXT = 'Go to the next slide of active Powerpoint Presentation.'
HOTKEY_DESC_LAST = 'Go to the last slide of active Powerpoint Presentation.'

# ------------------------------------------------------------
# global functions for script plugins

def script_load(settings):
    global hotkey_id_frst
    global hotkey_id_prev
    global hotkey_id_next
    global hotkey_id_last

    hotkey_id_frst = register_and_load_hotkey(settings, HOTKEY_NAME_FRST, HOTKEY_DESC_FRST, slideshow_view_first)
    hotkey_id_prev = register_and_load_hotkey(settings, HOTKEY_NAME_PREV, HOTKEY_DESC_PREV, slideshow_view_previous)
    hotkey_id_next = register_and_load_hotkey(settings, HOTKEY_NAME_NEXT, HOTKEY_DESC_NEXT, slideshow_view_next)
    hotkey_id_last = register_and_load_hotkey(settings, HOTKEY_NAME_LAST, HOTKEY_DESC_LAST, slideshow_view_last)

def script_unload():
    obs.obs_hotkey_unregister(slideshow_view_first)
    obs.obs_hotkey_unregister(slideshow_view_previous)
    obs.obs_hotkey_unregister(slideshow_view_next)
    obs.obs_hotkey_unregister(slideshow_view_last)

def script_save(settings):
    save_hotkey(settings, HOTKEY_NAME_FRST, hotkey_id_frst)
    save_hotkey(settings, HOTKEY_NAME_PREV, hotkey_id_prev)
    save_hotkey(settings, HOTKEY_NAME_NEXT, hotkey_id_next)
    save_hotkey(settings, HOTKEY_NAME_LAST, hotkey_id_last)

def script_description():
    return 'Navigate Powerpoint Slides.'

def script_defaults(settings):
    obs.obs_data_set_default_int(settings, 'interval', 10)
    obs.obs_data_set_default_string(settings, 'source', '')

def register_and_load_hotkey(settings, name, description, callback):
    hotkey_id = obs.obs_hotkey_register_frontend(name, description, callback)
    hotkey_save_array = obs.obs_data_get_array(settings, name)
    obs.obs_hotkey_load(hotkey_id, hotkey_save_array)
    obs.obs_data_array_release(hotkey_save_array)

    return hotkey_id

def save_hotkey(settings, name, hotkey_id):
    hotkey_save_array = obs.obs_hotkey_save(hotkey_id)
    obs.obs_data_set_array(settings, name, hotkey_save_array)
    obs.obs_data_array_release(hotkey_save_array)

def get_slideshow_view():
    global powerpoint

    if powerpoint is None:
        powerpoint = win32com.client.Dispatch('Powerpoint.Application')

    if powerpoint is None:
        return

    ssw = powerpoint.SlideShowWindows
    if ssw.Count == 0:
        return

    # https://docs.microsoft.com/en-us/office/vba/api/powerpoint.slideshowwindow.view
    ssv = ssw[0].View

    return ssv

def slideshow_view_first(pressed):
    if pressed:
        ssv = get_slideshow_view()
        if ssv:
            ssv.First()

def slideshow_view_previous(pressed):
    if pressed:
        ssv = get_slideshow_view()
        if ssv:
            ssv.Previous()

def slideshow_view_next(pressed):
    if pressed:
        ssv = get_slideshow_view()
        if ssv:
            ssv.Next()

def slideshow_view_last(pressed):
    if pressed:
        ssv = get_slideshow_view()
        if ssv:
            ssv.Last()
