import threading
import os
import sys

workers = 2
worker_class = 'gthread'
threads = 4
timeout = 3600
keepalive = 65
max_requests = 1000
max_requests_jitter = 100

# bind is a fallback only — start.sh passes --bind on the CLI which takes
# precedence over this value. os.getenv works because start.sh exports
# APP_PORT into the environment before exec-ing gunicorn.
bind = f"0.0.0.0:{os.getenv('APP_PORT', '6001')}"

accesslog = '/website/logs/access.log'
errorlog  = '/website/logs/error.log'
loglevel  = 'info'


def post_fork(server, worker):
    """Re-spawn LocalQueue consumer threads inside each forked worker.
    Python threads do not survive fork(); without this hook every conversion
    job sits in 'queued' state indefinitely under multi-worker gunicorn."""
    try:
        flask_dir = os.path.dirname(os.path.abspath(__file__))
        if flask_dir not in sys.path:
            sys.path.insert(0, flask_dir)

        from local_jobs import _local_queue, LocalQueue

        alive = [t for t in (_local_queue._workers or []) if t.is_alive()]
        if alive:
            server.log.info(
                "LocalQueue: %d worker thread(s) already running — skipping restart.",
                len(alive)
            )
            return

        _local_queue._workers = []
        for _ in range(LocalQueue._NUM_WORKERS):
            t = threading.Thread(target=_local_queue._consume, daemon=True)
            t.start()
            _local_queue._workers.append(t)
        server.log.info(
            "LocalQueue: %d worker thread(s) restarted in forked worker.",
            LocalQueue._NUM_WORKERS
        )
    except Exception as e:
        server.log.error("Failed to restart LocalQueue worker threads: %s", e)
