from __future__ import annotations

import json
import os
import urllib.parse
import urllib.request
from typing import Any

from langchain.tools import tool

RAPIDAPI_HOST = "sec-event-intelligence.p.rapidapi.com"
API_BASE_URL = f"https://{RAPIDAPI_HOST}"


def _rapidapi_get(path: str, params: dict[str, Any]) -> dict[str, Any]:
    rapidapi_key = os.environ["RAPIDAPI_KEY"]
    query = urllib.parse.urlencode(params)
    request = urllib.request.Request(
        f"{API_BASE_URL}{path}?{query}",
        headers={
            "x-rapidapi-host": RAPIDAPI_HOST,
            "x-rapidapi-key": rapidapi_key,
            "accept": "application/json",
        },
    )
    with urllib.request.urlopen(request, timeout=30) as response:
        return json.loads(response.read().decode("utf-8"))


@tool
def sec_watchlist_changes(
    tickers: str,
    since: str = "2026-07-01",
    limit: int = 25,
) -> dict[str, Any]:
    """Fetch SEC filing changes for a comma-separated ticker watchlist.

    Args:
        tickers: Comma-separated ticker symbols, for example AAPL,MSFT,NVDA.
        since: Earliest filed date in YYYY-MM-DD format.
        limit: Maximum filings to return per request.
    """
    return _rapidapi_get(
        "/v1/sec/watchlist/changes",
        {"tickers": tickers, "since": since, "limit": str(limit)},
    )


@tool
def sec_filing_summary(accession_no: str) -> dict[str, Any]:
    """Fetch one normalized SEC filing summary by accession number.

    Args:
        accession_no: SEC accession number from a filing search or watchlist result.
    """
    return _rapidapi_get(
        f"/v1/sec/forms/{urllib.parse.quote(accession_no, safe='')}/summary",
        {},
    )


LANGCHAIN_TOOLS = [sec_watchlist_changes, sec_filing_summary]


if __name__ == "__main__":
    payload = sec_watchlist_changes.invoke({
        "tickers": "AAPL,MSFT,NVDA",
        "since": "2026-07-01",
        "limit": 5,
    })
    print(json.dumps(payload, indent=2))
