#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# NQ 29,204 도달 시 1회 알림 + 리셋 대상 종목 현황 동봉
import os, re, json, datetime, urllib.request, urllib.parse

BASE = os.path.expanduser("~/Claude/Projects/에이전트구축")
NQLEV = os.path.join(BASE, "nq_levels.py")
FLAG = os.path.join(BASE, "watch_nq_state.json")
TRIGGER = 29204
LONG = {"MUUSDT": 898.49, "SOXLUSDT": 153.98, "NBISUSDT": 195.12,
        "DRAMUSDT": 68.173, "BTCUSDT": 62140.13, "ETHUSDT": 1732.59, "SOLUSDT": 70.081}

def send(msg):
    s = open(NQLEV, encoding="utf-8").read()
    tok = re.search(r'BOT_TOKEN\s*=\s*["\']([^"\']+)', s).group(1)
    cid = re.search(r'CHAT_ID\s*=\s*["\']?([^"\'\s]+)', s).group(1)
    d = urllib.parse.urlencode({"chat_id": cid, "text": msg}).encode()
    urllib.request.urlopen(f"https://api.telegram.org/bot{tok}/sendMessage", d, timeout=15)

def nq():
    u = "https://query1.finance.yahoo.com/v8/finance/chart/NQ=F?interval=1m&range=1d"
    r = urllib.request.Request(u, headers={"User-Agent": "Mozilla/5.0"})
    d = json.load(urllib.request.urlopen(r, timeout=15))
    return float(d["chart"]["result"][0]["meta"]["regularMarketPrice"])

def mark(sym):
    u = f"https://api.bybit.com/v5/market/tickers?category=linear&symbol={sym}"
    r = urllib.request.Request(u, headers={"User-Agent": "Mozilla/5.0"})
    return float(json.load(urllib.request.urlopen(r, timeout=15))["result"]["list"][0]["markPrice"])

try: st = json.load(open(FLAG))
except Exception: st = {}
today = str(datetime.date.today())
if st.get("date") != today: st = {"date": today}

p = nq()
if p <= TRIGGER and not st.get("fired"):
    lines = []
    for sym, avg in LONG.items():
        try: m = mark(sym)
        except Exception: continue
        gap = (m / avg - 1) * 100
        mark_txt = "리셋" if gap < 0 else "대기"
        if sym == "DRAMUSDT": mark_txt = "저수지(제외)"
        if sym == "SOXLUSDT" and gap < 0: mark_txt = "리셋+증량"
        lines.append(f"{sym.replace('USDT','')} {m:,.2f} vs 평단 {avg:,.2f} ({gap:+.1f}%) {mark_txt}")
    send(f"[NQ {TRIGGER} 도달] 현재 {p:,.0f}\n\n" + "\n".join(lines))
    st["fired"] = True
    print("발송함")
else:
    print(f"NQ {p:,.2f} — 트리거 {TRIGGER}까지 {p-TRIGGER:,.0f}p")
json.dump(st, open(FLAG, "w"))
