"""
Скрипт для автоматического запуска Cloudflare Tunnel и Telegram бота.
1. Запускает cloudflared туннель к порту 8080
2. Перехватывает выданный публичный HTTPS URL (trycloudflare.com)
3. Обновляет SERVER_URL в .env и config
4. Запускает main.py (сервер + бот)
"""
import os
import re
import subprocess
import sys
import threading
import time

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
CLOUDFLARED_BIN = os.path.join(BASE_DIR, "cloudflared.exe")
ENV_FILE = os.path.join(BASE_DIR, ".env")


def update_env_file(tunnel_url: str):
    if not os.path.exists(ENV_FILE):
        return
    with open(ENV_FILE, "r", encoding="utf-8") as f:
        content = f.read()

    if "SERVER_URL=" in content:
        content = re.sub(r"SERVER_URL=.*", f"SERVER_URL={tunnel_url}", content)
    else:
        content += f"\nSERVER_URL={tunnel_url}\n"

    with open(ENV_FILE, "w", encoding="utf-8") as f:
        f.write(content)


def main():
    if not os.path.exists(CLOUDFLARED_BIN):
        print(f"[!] cloudflared.exe не найден в {BASE_DIR}")
        sys.exit(1)

    print("[*] Запуск Cloudflare Tunnel...")
    cf_proc = subprocess.Popen(
        [CLOUDFLARED_BIN, "tunnel", "--url", "http://localhost:8080"],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True,
        encoding="utf-8",
        errors="ignore",
    )

    tunnel_url = None
    url_pattern = re.compile(r"https://[a-zA-Z0-9-]+\.trycloudflare\.com")

    # Читаем stderr cloudflared для поиска URL
    start_time = time.time()
    while time.time() - start_time < 30:
        line = cf_proc.stderr.readline()
        if not line:
            if cf_proc.poll() is not None:
                break
            time.sleep(0.1)
            continue
        
        match = url_pattern.search(line)
        if match:
            tunnel_url = match.group(0)
            break

    if not tunnel_url:
        print("[!] Не удалось получить URL туннеля от cloudflared")
        cf_proc.kill()
        sys.exit(1)

    print(f"[✓] Туннель поднят: {tunnel_url}")
    print(f"[✓] Игра доступна по адресу: {tunnel_url}/game/index.html")
    update_env_file(tunnel_url)
    os.environ["SERVER_URL"] = tunnel_url

    # Фоновый поток для логирования cloudflared (чтобы не забивать буфер)
    def drain_stderr():
        for _ in cf_proc.stderr:
            pass

    threading.Thread(target=drain_stderr, daemon=True).start()

    print("[*] Запуск сервера и бота (main.py)...")
    try:
        from main import main as run_main
        run_main()
    except KeyboardInterrupt:
        print("\n[*] Завершение работы...")
    finally:
        cf_proc.terminate()


if __name__ == "__main__":
    main()
