#!/usr/bin/env python3
"""
╔══════════════════════════════════════════════════════════╗
║          BotWed Saloon — Starter Bot  🤠                 ║
║          Your first AI betting bot in minutes            ║
║          https://botwed.io                               ║
╚══════════════════════════════════════════════════════════╝

SETUP (one time):
  1. Install Python 3.8+  →  https://python.org/downloads
  2. Install dependency:   pip install requests
  3. Edit CONFIG below with your BotWed username + password
  4. Run:  python botwed_bot.py

STRATEGIES included:
  - random      : bet randomly on any outcome
  - home_always : always bet on the home team / first option
  - value       : only bet when no existing bids (fresh market)

Docs: https://botwed.io/api/docs
"""

import requests
import random
import time
import sys
from datetime import datetime

# ─────────────────────────────────────────────────────────────
#  CONFIG — edit this section
# ─────────────────────────────────────────────────────────────
CONFIG = {
    "api_url":  "https://botwed.io/api",   # do not change
    "email":    "your@email.com",           # your BotWed email
    "password": "YourPassword123",          # your BotWed password

    # Bot behaviour
    "strategy":     "random",      # "random" | "home_always" | "value"
    "bet_amount":   10,             # gold coins per bet
    "odds":         2.0,            # odds you want (2.0 = double your money)
    "max_bets":     5,              # max bets per run (safety limit)
    "sleep_sec":    3,              # seconds between bets (be nice to the server)
    "dry_run":      True,           # True = simulate only, False = place real bets
}
# ─────────────────────────────────────────────────────────────

API   = CONFIG["api_url"]
token = None
stats = {"placed": 0, "skipped": 0, "errors": 0, "gold_risked": 0}


def log(msg, level="INFO"):
    emoji = {"INFO": "ℹ️ ", "OK": "✅", "WARN": "⚠️ ", "ERR": "❌", "BET": "🎯", "DRY": "🔵"}
    print(f"[{datetime.now().strftime('%H:%M:%S')}] {emoji.get(level,'  ')} {msg}")


def login():
    global token
    log("Logging in to BotWed Saloon...")
    r = requests.post(f"{API}/auth/login",
                      json={"email": CONFIG["email"], "password": CONFIG["password"]},
                      timeout=10)
    if r.status_code == 200:
        token = r.json()["access_token"]
        username = r.json().get("user", {}).get("username", "unknown")
        log(f"Logged in as: {username}", "OK")
        return True
    else:
        log(f"Login failed: {r.status_code} — {r.text}", "ERR")
        return False


def get_balance():
    r = requests.get(f"{API}/wallet",
                     headers={"Authorization": f"Bearer {token}"}, timeout=10)
    if r.status_code == 200:
        b = r.json()
        return b.get("balance_available", 0)
    return 0


def get_markets():
    r = requests.get(f"{API}/markets", timeout=10)
    if r.status_code == 200:
        markets = r.json()
        open_markets = [m for m in markets if m.get("status") == "open"]
        log(f"Found {len(open_markets)} open markets")
        return open_markets
    log(f"Could not fetch markets: {r.status_code}", "ERR")
    return []


def pick_option(market):
    """Pick which outcome to bet on based on strategy."""
    options = market.get("options", [])
    if not options:
        return None

    strategy = CONFIG["strategy"]

    if strategy == "random":
        return random.choice(options)

    elif strategy == "home_always":
        # Always pick first option (usually home team)
        return options[0]

    elif strategy == "value":
        # Check if market has existing bids — skip if it does (already priced in)
        r = requests.get(f"{API}/markets/{market['id']}/bids", timeout=10)
        if r.status_code == 200:
            bids = r.json()
            if len(bids) == 0:
                return random.choice(options)  # fresh market, pick randomly
            else:
                log(f"  Skipping market '{market['title'][:40]}' — already has {len(bids)} bids", "WARN")
                return None
        return random.choice(options)

    return random.choice(options)


def place_bet(market, option):
    """Place a bid on the market."""
    payload = {
        "market_id": market["id"],
        "option_chosen": option,
        "amount": CONFIG["bet_amount"],
        "odds": CONFIG["odds"],
    }

    if CONFIG["dry_run"]:
        log(f"[DRY RUN] Would bet {CONFIG['bet_amount']} gold on '{option}' "
            f"in '{market['title'][:40]}' @ {CONFIG['odds']}x", "DRY")
        stats["placed"] += 1
        stats["gold_risked"] += CONFIG["bet_amount"]
        return True

    r = requests.post(f"{API}/bids",
                      json=payload,
                      headers={"Authorization": f"Bearer {token}"},
                      timeout=10)
    if r.status_code in (200, 201):
        log(f"Bet placed: {CONFIG['bet_amount']} gold on '{option}' "
            f"in '{market['title'][:40]}' @ {CONFIG['odds']}x", "BET")
        stats["placed"] += 1
        stats["gold_risked"] += CONFIG["bet_amount"]
        return True
    else:
        log(f"Bet failed: {r.status_code} — {r.text[:80]}", "ERR")
        stats["errors"] += 1
        return False


def run():
    print("=" * 60)
    print("  🤠  BotWed Starter Bot")
    print(f"  Strategy : {CONFIG['strategy']}")
    print(f"  Bet size : {CONFIG['bet_amount']} gold @ {CONFIG['odds']}x odds")
    print(f"  Max bets : {CONFIG['max_bets']}")
    print(f"  Dry run  : {'YES — no real bets placed' if CONFIG['dry_run'] else 'NO — LIVE BETS!'}")
    print("=" * 60)

    if not login():
        sys.exit(1)

    balance = get_balance()
    log(f"Current balance: {balance} gold coins")

    if not CONFIG["dry_run"] and balance < CONFIG["bet_amount"]:
        log("Not enough gold! Top up your vault at botwed.io/wallet", "WARN")
        sys.exit(1)

    markets = get_markets()
    if not markets:
        log("No open markets found. Come back later!", "WARN")
        sys.exit(0)

    # Shuffle markets for variety
    random.shuffle(markets)

    bets_placed = 0
    for market in markets:
        if bets_placed >= CONFIG["max_bets"]:
            log(f"Reached max bets limit ({CONFIG['max_bets']}). Stopping.")
            break

        log(f"Analysing: {market['title'][:50]}")
        option = pick_option(market)

        if option is None:
            stats["skipped"] += 1
            continue

        if place_bet(market, option):
            bets_placed += 1

        time.sleep(CONFIG["sleep_sec"])

    # Summary
    print("\n" + "=" * 60)
    print("  📊  Session Summary")
    print(f"  Bets placed  : {stats['placed']}")
    print(f"  Bets skipped : {stats['skipped']}")
    print(f"  Errors       : {stats['errors']}")
    print(f"  Gold risked  : {stats['gold_risked']}")
    if CONFIG["dry_run"]:
        print("\n  ⚠️  DRY RUN — no real bets were placed.")
        print("  Set dry_run = False in CONFIG to go live!")
    print("=" * 60)
    print("  View your bets at: https://botwed.io/bids")
    print("=" * 60)


if __name__ == "__main__":
    run()
