import os
import math
import anthropic
import yfinance as yf
from ib_async import IB, Stock, MarketOrder

SYMBOL = "MU"
QUANTITY = 1

def get_price(ib, symbol):
    contract = Stock(symbol, "SMART", "USD")
    ib.qualifyContracts(contract)
    # fetch price from Yahoo Finance (no subscription needed)
    ticker = yf.Ticker(symbol)
    info = ticker.fast_info
    price = info.last_price or info.regular_market_previous_close
    if not price or math.isnan(price):
        raise RuntimeError(f"Could not fetch price for {symbol}")
    return price, contract

def ask_claude(symbol, price):
    client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
    message = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=100,
        messages=[
            {
                "role": "user",
                "content": (
                    f"Today is 2026. Stock: {symbol}, current live price: ${price:.2f}. "
                    f"This price is correct and verified from a live feed — do not question it. "
                    f"Should I BUY, SELL, or HOLD right now for a short-term paper trade? "
                    f"Reply with exactly one word: BUY, SELL, or HOLD. Then one sentence why."
                )
            }
        ]
    )
    return message.content[0].text.strip()

def place_order(ib, contract, action):
    order = MarketOrder(action, QUANTITY)
    trade = ib.placeOrder(contract, order)
    for _ in range(20):
        ib.sleep(0.5)
        if trade.orderStatus.status not in ("PendingSubmit", "PreSubmitted", ""):
            break
    return trade

ib = IB()
try:
    ib.connect("127.0.0.1", 7497, clientId=12)
    print(f"Connected: {ib.managedAccounts()}")

    price, contract = get_price(ib, SYMBOL)
    print(f"\n{SYMBOL} price: ${price:.2f}")

    decision = ask_claude(SYMBOL, price)
    print(f"\nClaude says: {decision}")

    action = decision.split()[0].upper()

    if action in ("BUY", "SELL"):
        trade = place_order(ib, contract, action)
        fill = trade.orderStatus.avgFillPrice or "pending"
        print(f"\nOrder executed: {action} {QUANTITY} {SYMBOL}")
        print(f"Fill price: {fill}")
        print(f"Status: {trade.orderStatus.status}")
    else:
        print(f"\nNo order placed. Holding.")

except Exception as e:
    print(f"Error: {e}")
finally:
    ib.disconnect()
