"""장시간 실행 작업을 위한 인터럽트 메커니즘.

시그널(SIGINT/SIGTERM) 또는 직접 set() 호출로 중단 플래그를 설정한다.
장시간 루프 안에서 INTERRUPT.is_set()을 폴링하여 중단을 감지한다.

Usage:
    from utils.interrupt import INTERRUPT, register_signal_handler

    register_signal_handler()  # SIGINT/SIGTERM 핸들러 등록

    while not INTERRUPT.is_set():
        do_work()
"""

from __future__ import annotations

import signal
import threading


class InterruptFlag:
    """스레드 안전한 인터럽트 플래그.

    Methods:
        set()      — 인터럽트 플래그를 설정한다.
        is_set()   — 플래그 설정 여부를 반환한다.
        reset()    — 플래그를 초기화한다.
    """

    def __init__(self) -> None:
        self._event = threading.Event()

    def set(self) -> None:
        self._event.set()

    def is_set(self) -> bool:
        return self._event.is_set()

    def reset(self) -> None:
        self._event.clear()


INTERRUPT = InterruptFlag()


def register_signal_handler() -> None:
    """SIGINT/SIGTERM 수신 시 글로벌 INTERRUPT 플래그를 설정하는 핸들러를 등록한다."""

    def _handler(signum: int, frame: object) -> None:
        INTERRUPT.set()

    signal.signal(signal.SIGINT, _handler)
    signal.signal(signal.SIGTERM, _handler)
