"""Processus de traitement des imports (OCR, analyse) : une tâche à la fois, sans bloquer l'interface."""
from __future__ import annotations

import logging
import signal
import time

from ..core.config import get_config
from ..core.db import new_session
from . import service

log = logging.getLogger("edcf.worker")
_stop = False


def _handle(signum: int, _frame: object) -> None:
    global _stop
    _stop = True


def run_forever() -> None:
    logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s %(message)s")
    signal.signal(signal.SIGTERM, _handle)
    signal.signal(signal.SIGINT, _handle)
    poll = get_config().worker_poll_seconds
    log.info("Worker EDCF démarré (attente %.1fs).", poll)
    last_requeue = 0.0
    while not _stop:
        db = new_session()
        try:
            if time.monotonic() - last_requeue > 60:
                service.requeue_stale(db)
                last_requeue = time.monotonic()
            worked = service.run_next_job(db)
        except Exception:
            log.exception("Erreur du worker")
            worked = False
        finally:
            db.close()
        if not worked:
            time.sleep(poll)
    log.info("Worker arrêté.")
