import json
import re
import sys
import os
import urllib.request


def read_input():
    if len(sys.argv) > 1:
        try:
            with open(sys.argv[1], "r", encoding="utf-8") as f:
                return json.load(f)
        except Exception:
            return {}
    return {}


def safe_eval(expr):
    if not re.match(r"^[0-9\\s\\+\\-\\*\\/\\(\\)\\.]+$", expr):
        raise ValueError("unsafe_expression")
    return eval(expr, {"__builtins__": {}}, {})


def sum_first_n(n):
    return n * (n + 1) // 2


def request_sign(run_id, payload):
    token = os.environ.get("YEOMEN_RUNNER_TOKEN")
    base_url = os.environ.get("YEOMEN_API_BASE_URL", "https://skills.yeomen.ai")
    api = f"{base_url}/v1/runs/{run_id}/request-sign"
    headers = {"Content-Type": "application/json"}
    if token:
        headers["Authorization"] = f"Runner {token}"
    req = urllib.request.Request(api, data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
    with urllib.request.urlopen(req, timeout=15) as resp:
        return json.loads(resp.read().decode("utf-8"))

def mark_complete(run_id, payload):
    token = os.environ.get("YEOMEN_RUNNER_TOKEN")
    base_url = os.environ.get("YEOMEN_API_BASE_URL", "https://skills.yeomen.ai")
    api = f"{base_url}/v1/runs/{run_id}/complete"
    headers = {"Content-Type": "application/json"}
    if token:
        headers["Authorization"] = f"Runner {token}"
    req = urllib.request.Request(api, data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
    with urllib.request.urlopen(req, timeout=15) as resp:
        return json.loads(resp.read().decode("utf-8"))


def main():
    data = read_input()
    expression = data.get("expression")
    n = data.get("n")
    prompt = data.get("prompt", "")

    result = None
    if n is None and prompt:
        m = re.search(r"sum of first\\s+(\\d+)", prompt.lower())
        if m:
            n = int(m.group(1))
    if expression is None and prompt:
        m = re.search(r"([0-9][0-9\\s\\+\\-\\*\\/\\(\\)\\.]+)", prompt)
        if m:
            candidate = m.group(1).strip()
            if re.search(r"[\\+\\-\\*\\/]", candidate):
                expression = candidate

    try:
        if n is not None:
            result = sum_first_n(int(n))
        elif expression:
            result = safe_eval(expression)
    except Exception as exc:
        print(json.dumps({"ok": False, "error": str(exc)}))
        return

    output = {"ok": True, "result": result, "input": {"n": n}}
    if expression:
        output["input"]["expression"] = expression

    # Optional helper: if instructed, request signing via Yeomen API
    if data.get("request_sign"):
        run_id = os.environ.get("YEOMEN_RUN_ID")
        if run_id:
            payload = data.get("sign_payload") or {}
            try:
                output["sign_result"] = request_sign(run_id, payload)
            except Exception as exc:
                output["sign_error"] = str(exc)
    if data.get("request_complete"):
        run_id = os.environ.get("YEOMEN_RUN_ID")
        if run_id:
            payload = data.get("complete_payload") or {"status": "completed"}
            try:
                output["complete_result"] = mark_complete(run_id, payload)
            except Exception as exc:
                output["complete_error"] = str(exc)
    print(json.dumps(output))


if __name__ == "__main__":
    main()
