#!/usr/bin/env python3
import json
from http.server import HTTPServer, SimpleHTTPRequestHandler
from datetime import datetime
from collections import defaultdict

SPORTS_STATE = "sports_247_state.json"

BOTS = [
    {"name": "BTC", "state": "btc_state.json", "history": "btc_history.json"},
    {"name": "ETH", "state": "eth_state.json", "history": "eth_history.json"},
    {"name": "SOL", "state": "sol_state.json", "history": "sol_history.json"},
    {"name": "XRP", "state": "xrp_state.json", "history": "xrp_history.json"},
]

class DashboardHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.path = '/dashboard.html'
        return super().do_GET()
    
    def end_headers(self):
        self.send_header('Cache-Control', 'no-store')
        super().end_headers()


def safe_load(path, default):
    try:
        with open(path) as f:
            return json.load(f)
    except Exception:
        return default


def summarize_history(history):
    wins = sum(1 for t in history if t.get('pnl', 0) > 0)
    losses = sum(1 for t in history if t.get('pnl', 0) < 0)
    breakeven = sum(1 for t in history if t.get('pnl', 0) == 0)
    total_pnl = sum(t.get('pnl', 0) for t in history)
    return wins, losses, breakeven, total_pnl


def parse_trade_date(t):
    ts = t.get("time")
    if not ts:
        return None
    try:
        return datetime.fromisoformat(ts).date().isoformat()
    except Exception:
        return None


bots_data = []
all_daily = defaultdict(lambda: {"pnl": 0, "wins": 0, "losses": 0, "trades": 0})

# sports bot summary
sports_state = safe_load(SPORTS_STATE, {"balance": 1500, "trades": []})
sports_trades = sports_state.get("trades", []) or []
sports_closed = [t for t in sports_trades if t.get("status") == "closed" or "pnl" in t]
sports_wins = sum(1 for t in sports_closed if t.get("pnl", 0) > 0)
sports_losses = sum(1 for t in sports_closed if t.get("pnl", 0) < 0)

# polymarket paper bot summary
pm_state = safe_load("polymarket_state.json", {"balance": 1500, "trades": []})
pm_history = safe_load("polymarket_history.json", [])
pm_wins = sum(1 for t in pm_history if t.get("pnl", 0) > 0)
pm_losses = sum(1 for t in pm_history if t.get("pnl", 0) < 0)
pm_last = pm_history[-1] if pm_history else None

pm5_state = safe_load("polymarket_state_5m.json", {"balance": 1500, "trades": []})
pm5_history = safe_load("polymarket_history_5m.json", [])
pm5_wins = sum(1 for t in pm5_history if t.get("pnl", 0) > 0)
pm5_losses = sum(1 for t in pm5_history if t.get("pnl", 0) < 0)
pm5_last = pm5_history[-1] if pm5_history else None

for b in BOTS:
    state = safe_load(b["state"], {"balance": 1500, "trades": []})
    history = safe_load(b["history"], [])
    wins, losses, breakeven, total_pnl = summarize_history(history)
    open_trades = state.get("trades", []) or []
    last_trade = history[-1] if history else None

    # daily aggregation
    daily = defaultdict(lambda: {"pnl": 0, "wins": 0, "losses": 0, "trades": 0})
    for t in history:
        d = parse_trade_date(t)
        if not d:
            continue
        daily[d]["pnl"] += t.get("pnl", 0)
        daily[d]["trades"] += 1
        daily[d]["wins"] += 1 if t.get("pnl", 0) > 0 else 0
        daily[d]["losses"] += 1 if t.get("pnl", 0) < 0 else 0

        all_daily[d]["pnl"] += t.get("pnl", 0)
        all_daily[d]["trades"] += 1
        all_daily[d]["wins"] += 1 if t.get("pnl", 0) > 0 else 0
        all_daily[d]["losses"] += 1 if t.get("pnl", 0) < 0 else 0

    bots_data.append({
        **b,
        "balance": state.get("balance", 1500),
        "open_trades": open_trades,
        "wins": wins,
        "losses": losses,
        "breakeven": breakeven,
        "total_pnl": total_pnl,
        "last_trade": last_trade,
        "trades_count": len(history),
        "daily": daily,
    })


total_balance = sum(b["balance"] for b in bots_data)

latest_day = max(all_daily.keys()) if all_daily else None
latest_summary = all_daily.get(latest_day, {"pnl": 0, "wins": 0, "losses": 0, "trades": 0})

# write a once-per-day summary file
summary_path = "daily_summary.json"
try:
    existing = safe_load(summary_path, {})
except Exception:
    existing = {}

if latest_day and existing.get("date") != latest_day:
    summary_payload = {
        "date": latest_day,
        "pnl": latest_summary.get("pnl", 0),
        "wins": latest_summary.get("wins", 0),
        "losses": latest_summary.get("losses", 0),
        "trades": latest_summary.get("trades", 0),
    }
    with open(summary_path, "w") as f:
        json.dump(summary_payload, f)


def format_trade(t):
    if not t:
        return "—"
    ticker = t.get("ticker", "?")
    pnl = t.get("pnl", 0)
    entry = t.get("entry", 0)
    exitp = t.get("exit", 0)
    ts = t.get("time", "")
    return f"{ticker} | entry {entry:.2f} exit {exitp:.2f} | pnl {pnl:.2f} | {ts}"


html = f'''<!DOCTYPE html>
<html>
<head>
    <title>Trading Dashboard</title>
    <style>
        body {{ font-family: monospace; background: #0b0b0b; color: #eaeaea; padding: 20px; }}
        h1 {{ color: #fff; }}
        .grid {{ display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; }}
        .bot {{ padding: 15px; border: 1px solid #333; border-radius: 8px; background: #111; }}
        .balance {{ font-size: 24px; color: #0f0; }}
        .loss {{ color: #f55; }}
        .muted {{ color: #888; }}
        .total {{ font-size: 28px; color: #fff; margin-top: 20px; }}
        table {{ width: 100%; border-collapse: collapse; margin-top: 8px; }}
        th, td {{ text-align: left; padding: 4px 0; }}
        .open {{ color: #ffb347; }}
    </style>
</head>
<body>
    <h1>Trading Dashboard</h1>
    <div class="bot" style="max-width: 520px; margin-bottom: 16px;">
        <h2>Daily Summary {latest_day if latest_day else ''}</h2>
        <table>
            <tr><th>Trades</th><td>{latest_summary.get('trades', 0)}</td></tr>
            <tr><th>Wins</th><td>{latest_summary.get('wins', 0)}</td></tr>
            <tr><th>Losses</th><td class='loss'>{latest_summary.get('losses', 0)}</td></tr>
            <tr><th>PnL</th><td>{latest_summary.get('pnl', 0):.2f}</td></tr>
        </table>
    </div>
    <h2>Kalshi Bots</h2>
    <div class="grid">
        {''.join([
            f"""
            <div class='bot'>
                <h2>{b['name']} Bot</h2>
                <div class='balance'>${b['balance']:.2f}</div>
                <table>
                    <tr><th>Trades</th><td>{b['trades_count']}</td></tr>
                    <tr><th>Wins</th><td>{b['wins']}</td></tr>
                    <tr><th>Losses</th><td class='loss'>{b['losses']}</td></tr>
                    <tr><th>Breakeven</th><td>{b['breakeven']}</td></tr>
                    <tr><th>Total PnL</th><td>{b['total_pnl']:.2f}</td></tr>
                    <tr><th>Open Trades</th><td class='open'>{len(b['open_trades'])}</td></tr>
                </table>
                <div class='muted'>Last Trade: {format_trade(b['last_trade'])}</div>
            </div>
            """
        for b in bots_data])}
        <div class='bot'>
            <h2>Sports Bot</h2>
            <div class='balance'>${sports_state.get('balance', 0):.2f}</div>
            <table>
                <tr><th>Closed Trades</th><td>{len(sports_closed)}</td></tr>
                <tr><th>Wins</th><td>{sports_wins}</td></tr>
                <tr><th>Losses</th><td class='loss'>{sports_losses}</td></tr>
            </table>
        </div>
    </div>
    <div class="total">Total Balance: ${total_balance:.2f}</div>

    <h2 style="margin-top:24px;">Polymarket Bots</h2>
    <div class="grid">
        <div class='bot'>
            <h2>BTC 15m</h2>
            <div class='balance'>${pm_state.get('balance', 0):.2f}</div>
            <table>
                <tr><th>Open Trades</th><td class='open'>{len(pm_state.get('trades', []))}</td></tr>
                <tr><th>Total Trades</th><td>{len(pm_history)}</td></tr>
                <tr><th>Wins</th><td>{pm_wins}</td></tr>
                <tr><th>Losses</th><td class='loss'>{pm_losses}</td></tr>
            </table>
            <div class='muted'>Last Trade: {format_trade(pm_last)}</div>
        </div>
        <div class='bot'>
            <h2>BTC 5m</h2>
            <div class='balance'>${pm5_state.get('balance', 0):.2f}</div>
            <table>
                <tr><th>Open Trades</th><td class='open'>{len(pm5_state.get('trades', []))}</td></tr>
                <tr><th>Total Trades</th><td>{len(pm5_history)}</td></tr>
                <tr><th>Wins</th><td>{pm5_wins}</td></tr>
                <tr><th>Losses</th><td class='loss'>{pm5_losses}</td></tr>
            </table>
            <div class='muted'>Last Trade: {format_trade(pm5_last)}</div>
        </div>
    </div>

    <div class="muted">Updated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</div>
    <div style="margin-top: 24px;">
        <h2>BTC 15m Chart</h2>
        <iframe src="https://s.tradingview.com/widgetembed/?frameElementId=tradingview_btc15m&symbol=BINANCE:BTCUSDT&interval=15&hidesidetoolbar=1&symboledit=0&saveimage=0&toolbarbg=1f1f1f&studies=[]&theme=dark&style=1&timezone=Etc/UTC&withdateranges=1&hideideas=1&hidevolume=0&allow_symbol_change=0" style="width:100%;height:480px;border:0;"></iframe>
    </div>
</body>
</html>'''

with open('dashboard.html', 'w') as f:
    f.write(html)

print(" | ".join([f"{b['name']}: ${b['balance']:.2f} (W{b['wins']}/L{b['losses']})" for b in bots_data]) + f" | Total: ${total_balance:.2f}")
