"""Route Lighter SDK aiohttp traffic through a SOCKS5 proxy (Thai VPS)."""
from __future__ import annotations

import logging
import os
import ssl
from typing import Optional

log = logging.getLogger("lighter_mm.socks")

_PATCHED = False


def install_socks_proxy(proxy_url: Optional[str] = None) -> Optional[str]:
    """Monkeypatch lighter.rest.RESTClientObject to use aiohttp-socks.

    Returns the proxy URL used, or None if disabled.
    Env: LIGHTER_SOCKS_PROXY (default socks5://127.0.0.1:10808 when set to auto
    via LIGHTER_SOCKS=1).
    """
    global _PATCHED
    if proxy_url is None:
        proxy_url = os.environ.get("LIGHTER_SOCKS_PROXY", "").strip()
        if not proxy_url and os.environ.get("LIGHTER_SOCKS", "") == "1":
            proxy_url = "socks5://127.0.0.1:10808"
    if not proxy_url:
        return None
    if _PATCHED:
        return proxy_url

    try:
        import aiohttp
        from aiohttp_socks import ProxyConnector
        import lighter.rest as rest_mod
    except Exception as e:
        raise RuntimeError(f"SOCKS proxy requested but unavailable: {e}") from e

    def _init(self, configuration):
        maxsize = configuration.connection_pool_maxsize
        ssl_context = ssl.create_default_context(cafile=configuration.ssl_ca_cert)
        if configuration.cert_file:
            ssl_context.load_cert_chain(
                configuration.cert_file, keyfile=configuration.key_file
            )
        if not configuration.verify_ssl:
            ssl_context.check_hostname = False
            ssl_context.verify_mode = ssl.CERT_NONE
        connector = ProxyConnector.from_url(
            proxy_url, ssl=ssl_context, limit=maxsize
        )
        self.proxy = None
        self.proxy_headers = None
        self.pool_manager = aiohttp.ClientSession(
            connector=connector, trust_env=False
        )
        self.retry_client = None

    rest_mod.RESTClientObject.__init__ = _init  # type: ignore[method-assign]
    _PATCHED = True
    log.info("Lighter SDK REST patched for SOCKS proxy %s", proxy_url)
    return proxy_url
