import ctypes
from PySide6.QtWidgets import QApplication
from gui import TranslationApp  # 기존 TranslationApp UI 사용
from logger_module import setup_logger
import asyncio
import os
from whale_translator import WhaleTranslator


# 절전모드를 방지하는 설정 값
ES_CONTINUOUS = 0x80000000
ES_SYSTEM_REQUIRED = 0x00000001

def prevent_sleep():
    """절전모드 방지를 위해 시스템 설정을 변경"""
    ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)

def allow_sleep():
    """절전모드 방지 설정을 해제"""
    ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS)

async def process_qt_events(app, stop_event):
    """PySide6의 이벤트를 처리하는 비동기 함수"""
    while not stop_event.done():
        app.processEvents()
        await asyncio.sleep(0.01)  # 10ms마다 Qt 이벤트 처리

async def main():
    # 로깅 설정
    logger = setup_logger('default_logger', f'appTranslator.log')

    # 절전모드 방지 활성화
    prevent_sleep()

    app = None
    window = None  # window 변수를 None으로 초기화하여 finally 블록에서 참조 가능하도록 함

    stop_event = asyncio.Future() # 종료 이벤트 생성

    try:
        # PySide6 앱 실행
        app = QApplication([])

        # DPI 설정
        try:
            # DPI 인식 설정을 위한 환경 변수
            os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
            os.environ["QT_SCALE_FACTOR"] = "1"
            
            # DPI 인식 설정
            ctypes.windll.shcore.SetProcessDpiAwareness(1)  # 시스템 DPI 인식 대신 개별 모니터 인식으로 변경
        except Exception as e:
            logger.error(f"DPI 인식 설정 실패: {e}")

        # 기존 TranslationApp UI 사용
        # whale_translator = WhaleTranslator(app, logger, secret_mode=True, vd_mode=True)  #  모드 켜기
        # await whale_translator.start_whale_browser()
        window = TranslationApp(logger, app)  # PySide6 UI
        window.show()

        # asyncio와 PySide6 이벤트 루프를 통합
        await asyncio.gather(
            process_qt_events(app, stop_event),  # PySide6 이벤트 처리, stop_event 추가
            window.run_async_tasks(),  # 비동기 작업
        )

    finally:
        # 앱 종료 시 절전모드 방지 해제
        allow_sleep()
        stop_event.set_result(True)  # 종료 이벤트 설정 (process_qt_events 종료)
        if window: # window가 생성되었을 경우에만 close() 호출
            await window.close() # window.close()를 finally 블록으로 이동

if __name__ == '__main__':
    asyncio.run(main())  # 비동기 함수는 asyncio.run()으로 실행
