#!/usr/bin/env python3
import json
import requests
from datetime import datetime, timezone

def get_polymarket_prices(market_id):
    url = f"https://gamma-api.polymarket.com/markets/{market_id}"
    try:
        resp = requests.get(url, timeout=5)
        if not resp.ok:
            return None, None, None, None
        
        m = resp.json()
        yes_bid = float(m.get('bestBid', 0)) if m.get('bestBid') else None
        yes_ask = float(m.get('bestAsk', 0)) if m.get('bestAsk') else None
        
        if yes_bid is None or yes_ask is None:
            token_id = m.get('clobTokenIds', [''])[0] if m.get('clobTokenIds') else None
            if token_id:
                ob_resp = requests.get(f"https://clob.polymarket.com/book?token_id={token_id}", timeout=5)
                if ob_resp.ok:
                    book = ob_resp.json()
                    bids = book.get('bids', [])
                    asks = book.get('asks', [])
                    if yes_bid is None and bids:
                        yes_bid = float(bids[0]['price'])
                    if yes_ask is None and asks:
                        yes_ask = float(asks[0]['price'])
        
        no_bid = (1 - yes_ask) if yes_ask is not None else None
        no_ask = (1 - yes_bid) if yes_bid is not None else None
        
        return yes_bid, yes_ask, no_bid, no_ask
    except:
        return None, None, None, None

def get_kalshi_prices(ticker):
    url = f"https://api.elections.kalshi.com/trade-api/v2/markets/{ticker}"
    try:
        resp = requests.get(url, timeout=5)
        if not resp.ok:
            return None, None, None, None
        
        m = resp.json().get('market', {})
        yes_bid = float(m.get('yes_bid_dollars', 0)) if m.get('yes_bid_dollars') else None
        yes_ask = float(m.get('yes_ask_dollars', 0)) if m.get('yes_ask_dollars') else None
        no_bid = float(m.get('no_bid_dollars', 0)) if m.get('no_bid_dollars') else None
        no_ask = float(m.get('no_ask_dollars', 0)) if m.get('no_ask_dollars') else None
        
        return yes_bid, yes_ask, no_bid, no_ask
    except:
        return None, None, None, None

def check_arbitrage():
    with open('matched_markets.json', 'r') as f:
        data = json.load(f)
    
    matches = data.get('matches', [])
    opportunities = []
    
    for match in matches:
        pm = match['polymarket']
        km = match['kalshi']
        
        p_yes_bid, p_yes_ask, p_no_bid, p_no_ask = get_polymarket_prices(pm['id'])
        k_yes_bid, k_yes_ask, k_no_bid, k_no_ask = get_kalshi_prices(km['id'])
        
        arb = None
        
        if p_yes_ask and k_no_ask:
            cost = p_yes_ask + k_no_ask
            profit = 1 - cost
            if profit > 0.01:
                arb = {
                    'type': 'Buy YES on Polymarket, Buy NO on Kalshi',
                    'profit': profit,
                    'poly_side': 'YES',
                    'poly_price': p_yes_ask,
                    'kalshi_side': 'NO',
                    'kalshi_price': k_no_ask
                }
        
        if p_no_ask and k_yes_ask:
            cost = p_no_ask + k_yes_ask
            profit = 1 - cost
            if profit > 0.01:
                if not arb or profit > arb['profit']:
                    arb = {
                        'type': 'Buy NO on Polymarket, Buy YES on Kalshi',
                        'profit': profit,
                        'poly_side': 'NO',
                        'poly_price': p_no_ask,
                        'kalshi_side': 'YES',
                        'kalshi_price': k_yes_ask
                    }
        
        if arb:
            opportunities.append({
                'polymarket': pm,
                'kalshi': km,
                'similarity': match['similarity'],
                'arbitrage': arb
            })
    
    output = {
        'timestamp': datetime.now(timezone.utc).isoformat(),
        'opportunities': opportunities
    }
    
    with open('arbitrage_data.json', 'w') as f:
        json.dump(output, f, indent=2)
    
    print(f"[{datetime.now(timezone.utc).strftime('%H:%M:%S')}] Found {len(opportunities)} arbitrage opportunities")
    
    for opp in opportunities:
        arb = opp['arbitrage']
        print(f"\n{opp['polymarket']['question'][:60]}...")
        print(f"  {arb['type']}")
        print(f"  Profit: ${arb['profit']:.3f} ({arb['profit']*100:.1f}%)")

if __name__ == '__main__':
    check_arbitrage()
