# passenger_wsgi.py — Arranca y mantiene tu bot (con logs) bajo Passenger

import os, sys, threading, time, asyncio, traceback
from datetime import datetime

APP_DIR = os.path.dirname(__file__)
sys.path.insert(0, APP_DIR)

LOG_PATH = os.path.join(APP_DIR, "passenger.log")

def log(msg):
    try:
        with open(LOG_PATH, "a", encoding="utf-8") as f:
            f.write(f"[{datetime.now().isoformat()}] {msg}\n")
    except Exception:
        pass
    print(msg, flush=True)

# 1) Importa tu main() con manejo de errores (para ver fallas de import)
try:
    from main import main as _bot_main
    log("[passenger] main.py importado correctamente.")
except Exception:
    log("[passenger] ERROR importando main.py:\n" + traceback.format_exc())
    # Creamos una app mínima para que Passenger no caiga, pero no arrancamos hilo
    def application(environ, start_response):
        start_response('500 Internal Server Error', [('Content-Type', 'text/plain; charset=utf-8')])
        return [b'Error importando main.py. Revisa passenger.log']
    raise  # deja el stack en logs de error de cPanel también

_started = False
_worker = None

def _run_bot_forever():
    while True:
        try:
            log("[passenger] Iniciando loop del bot...")
            asyncio.run(_bot_main())
        except Exception:
            log("[passenger] Bot crashed, reiniciando en 10s:\n" + traceback.format_exc())
            time.sleep(10)

def _start_once():
    global _started, _worker
    if _started:
        return
    _started = True
    _worker = threading.Thread(target=_run_bot_forever, daemon=True)
    _worker.start()
    log("[passenger] Bot thread started.")

# 2) Arranca el bot cuando Passenger carga este módulo (tras la PRIMER petición)
_start_once()

# 3) WSGI app mínima (y health-check)
def application(environ, start_response):
    # Pide /health para ver estado rápido
    if environ.get('PATH_INFO', '/') == '/health':
        start_response('200 OK', [('Content-Type', 'text/plain; charset=utf-8')])
        return [b'OK']
    start_response('200 OK', [('Content-Type', 'text/plain; charset=utf-8')])
    return [b'OK']
