import settings_store as settings

try:
    import razorpay
except Exception:
    razorpay = None


def key_id() -> str:
    return settings.get("RAZORPAY_KEY_ID", "") or ""


def _key_secret() -> str:
    return settings.get("RAZORPAY_KEY_SECRET", "") or ""


def is_configured() -> bool:
    return bool(razorpay and key_id() and _key_secret())


def _client():
    if not is_configured():
        return None
    return razorpay.Client(auth=(key_id(), _key_secret()))


def create_order(amount_paise: int, receipt: str):
    c = _client()
    if not c:
        raise RuntimeError("Razorpay not configured")
    import concurrent.futures

    def _do():
        return c.order.create({
            "amount": int(amount_paise),
            "currency": "INR",
            "payment_capture": 1,
            "receipt": receipt[:40],
        })

    with concurrent.futures.ThreadPoolExecutor(max_workers=1) as ex:
        fut = ex.submit(_do)
        try:
            return fut.result(timeout=15)
        except concurrent.futures.TimeoutError:
            raise RuntimeError("Razorpay request timed out (network egress). Works on your live server.")


def verify_signature(order_id: str, payment_id: str, signature: str) -> bool:
    c = _client()
    if not c:
        return False
    try:
        c.utility.verify_payment_signature({
            "razorpay_order_id": order_id,
            "razorpay_payment_id": payment_id,
            "razorpay_signature": signature,
        })
        return True
    except Exception:
        return False


def verify_webhook_signature(body: bytes, signature: str, secret: str) -> bool:
    c = _client()
    if not c or not secret or not signature:
        return False
    try:
        c.utility.verify_webhook_signature(body.decode("utf-8"), signature, secret)
        return True
    except Exception:
        return False
