import winreg
import win32event
import win32api
import os
import win32serviceutil


class TabletModeWatchServiceFramework(win32serviceutil.ServiceFramework):
    _svc_name_ = 'TabletModeWatchService'
    _svc_display_name_ = 'Tablet Mode Watch Service'

    registry_key_path = r'SYSTEM\CurrentControlSet\Control\PriorityControl'
    registry_value_name = 'ConvertibleSlateMode'

    previous_value = None
    event = win32event.CreateEvent(None, 0, 0, None)

    service_run = True

    def SvcDoRun(self):
        try:
            key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, self.registry_key_path, 0, winreg.KEY_NOTIFY | winreg.KEY_READ)
            
            previous_value, _ = winreg.QueryValueEx(key, self.registry_value_name)

            win32api.RegNotifyChangeKeyValue(key, True, winreg.REG_NOTIFY_CHANGE_LAST_SET, self.event, True)

            while self.service_run:
                result = win32event.WaitForSingleObject(self.event, win32event.INFINITE)

                if result == win32event.WAIT_OBJECT_0:
                    current_value, _ = winreg.QueryValueEx(key, self.registry_value_name)
                    if current_value != previous_value:
                        self.on_value_change(current_value)
                        previous_value = current_value
                    win32api.RegNotifyChangeKeyValue(key, True, winreg.REG_NOTIFY_CHANGE_LAST_SET, self.event, True)

        except Exception as e:
            pass
            # print(f"에러 발생: {e}")

        finally:
            # 레지스트리 키 닫기
            winreg.CloseKey(key)

    def on_value_change(self, new_value):
        if new_value == 1: # notebook
            os.system(r'C:\Windows\System32\pnputil.exe /enable-device "ACPI\SYNA0000\0"')
        else: # tablet
            os.system(r'C:\Windows\System32\pnputil.exe /disable-device "ACPI\SYNA0000\0"')

    def SvcStop(self):
        self.service_run = False
        win32event.SetEvent(self.event)

if '__main__' == __name__:
    win32serviceutil.HandleCommandLine(TabletModeWatchServiceFramework)
