import os
import base64
import datetime
import requests
import json
from dotenv import load_dotenv
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend

load_dotenv()

KEY_ID   = os.getenv("KALSHI_API_KEY_ID")
KEY_PATH = os.getenv("KALSHI_PRIVATE_KEY_PATH")
BASE_URL = "https://api.elections.kalshi.com"

def load_private_key(file_path):
    with open(file_path, "rb") as f:
        return serialization.load_pem_private_key(
            f.read(), password=None, backend=default_backend()
        )

def sign_request(private_key, timestamp, method, path):
    message = (timestamp + method + path).encode("utf-8")
    signature = private_key.sign(
        message,
        padding.PSS(mgf=padding.MGF1(hashes.SHA256()),
                    salt_length=padding.PSS.DIGEST_LENGTH),
        hashes.SHA256()
    )
    return base64.b64encode(signature).decode("utf-8")

def get_headers(method, path):
    ts  = str(int(datetime.datetime.now().timestamp() * 1000))
    pk  = load_private_key(KEY_PATH)
    sig = sign_request(pk, ts, method, path)
    return {
        "KALSHI-ACCESS-KEY":       KEY_ID,
        "KALSHI-ACCESS-TIMESTAMP": ts,
        "KALSHI-ACCESS-SIGNATURE": sig,
        "Content-Type":            "application/json"
    }

def get_markets_for_series(series_ticker):
    path     = "/trade-api/v2/markets"
    params   = f"?status=open&limit=100&series_ticker={series_ticker}"
    headers  = get_headers("GET", path)
    response = requests.get(BASE_URL + path + params, headers=headers)
    if response.status_code == 200:
        return response.json().get("markets", [])
    return []

# Known crypto series tickers to check directly
CRYPTO_SERIES = [
    "KXBTC",     "KXBTCD",    "KXBTCM",    "KXBTCH",
    "KXBTCMIN",  "KXBTC5M",   "KXBTCDAY",  "KXBTCWK",
    "KXBTCHIGH", "KXBTCLOW",  "KXBTCABOVE","KXBTCRANGE",
    "KXETH",     "KXETHD",    "KXDOGE",    "KXDOGEMAXM",
    "KXSOL",     "KXCRYPTO",  "KXCRYPTOD",
]

results = {}
print("Checking crypto series...")
for ticker in CRYPTO_SERIES:
    markets = get_markets_for_series(ticker)
    if markets:
        print(f"  FOUND: {ticker} — {len(markets)} markets")
        results[ticker] = []
        for m in markets:
            ask  = float(m.get("yes_ask_dollars") or 0)
            bid  = float(m.get("yes_bid_dollars") or 0)
            mid  = round((ask+bid)/2, 4) if (ask and bid) else 0
            vol  = float(m.get("volume_24h_fp") or m.get("volume_fp") or 0)
            exp  = m.get("expected_expiration_time") or m.get("close_time") or ""
            results[ticker].append({
                "ticker": m.get("ticker"),
                "title": m.get("title",""),
                "mid": mid, "bid": bid, "ask": ask,
                "volume": vol, "expires": exp
            })
    else:
        print(f"  empty: {ticker}")

# Save to file
with open("C:\\kalshibot\\crypto_markets.json", "w") as f:
    json.dump(results, f, indent=2)

print(f"\nDone. Results saved to crypto_markets.json")
print(f"Series with markets: {[k for k in results.keys()]}")
