# -*- coding: utf-8 -*-
"""
全局配置 — 所有凭证从环境变量读取，无硬编码敏感值
统一 .env 文件 → docker-compose env_file → os.getenv()
"""
import os as _os
import logging

# ══════════════════════════════════════════
# 环境变量读取（无默认敏感值）
# ══════════════════════════════════════════
def _env(key, default=None):
    val = _os.environ.get(key)
    if val is not None:
        return val
    if default is not None:
        return default
    raise RuntimeError(f"Missing required env: {key}")

def _env_opt(key, default=None):
    return _os.environ.get(key, default)

# ══════════════════════════════════════════
# OKX API
# ══════════════════════════════════════════
OKX_API_KEY = _env_opt("OKX_API_KEY", "997afd21-18a3-40cf-9717-6a0807a48065")
OKX_SECRET_KEY = _env_opt("OKX_SECRET_KEY", "B37E03EF8A5687C82980A3F54C438EB2")
OKX_PASSPHRASE = _env_opt("OKX_PASSPHRASE", "Dianfengshan1.")
OKX_BASE_URL = _env_opt("OKX_BASE_URL", "https://www.okx.com")

# ══════════════════════════════════════════
# Telegram
# ══════════════════════════════════════════
TG_TOKEN = _env_opt("TG_TOKEN", "")
TG_CHAT = _env_opt("TG_CHAT", "")
TG_API_ID = int(_env_opt("TG_API_ID", "0") or "0")
TG_API_HASH = _env_opt("TG_API_HASH", "")
TG_NEWS_CHANNELS = _env_opt("TG_NEWS_CHANNELS", "").split(",") if _env_opt("TG_NEWS_CHANNELS") else []

# ══════════════════════════════════════════
# Coinglass
# ══════════════════════════════════════════
CG_API_KEY = _env_opt("CG_API_KEY", "")
CG_BASE_URL = _env_opt("CG_BASE_URL", "https://www.keystore.com.cn/api/v1/proxy/coinglass")

# ══════════════════════════════════════════
# Etherscan
# ══════════════════════════════════════════
ETHERSCAN_API_KEY = _env_opt("ETHERSCAN_API_KEY", "")

# ══════════════════════════════════════════
# Dune Analytics
# ══════════════════════════════════════════
DUNE_ANALYTICS_APIKEY = _env_opt("DUNE_ANALYTICS_APIKEY", "")

# ══════════════════════════════════════════
# Massive Flat Files (S3-compatible)
# ══════════════════════════════════════════
MASSIVE_ACCESS_KEY = _env_opt("MASSIVE_ACCESS_KEY", "")
MASSIVE_SECRET_KEY = _env_opt("MASSIVE_SECRET_KEY", "")
MASSIVE_ENDPOINT   = _env_opt("MASSIVE_ENDPOINT", "https://files.massive.com")
MASSIVE_BUCKET     = _env_opt("MASSIVE_BUCKET", "flatfiles")

# ══════════════════════════════════════════
# MySQL 数据库
# ══════════════════════════════════════════
DB_HOST = _env_opt("DB_HOST", "127.0.0.1")
DB_PORT = int(_env_opt("DB_PORT", "3306"))
DB_USER = _env_opt("DB_USER", "admin")
DB_PASSWORD = _env_opt("DB_PASSWORD", "")
DB_NAME = _env_opt("DB_NAME", "coinglass_trader")
DB_ENABLED = _env_opt("DB_ENABLED", "true").lower() == "true"

# ══════════════════════════════════════════
# 模拟交易
# ══════════════════════════════════════════
PAPER_TRADING = _env_opt("PAPER_TRADING", "true").lower() == "true"
PAPER_INITIAL_EQUITY = float(_env_opt("PAPER_INITIAL_EQUITY", "10000"))

# ══════════════════════════════════════════
# 黄金交易
# ══════════════════════════════════════════
GOLD_TRADING_ENABLED = _env_opt("GOLD_TRADING_ENABLED", "false").lower() == "true"

# ══════════════════════════════════════════
# 运行模式
# ══════════════════════════════════════════
RUN_MODE = _env_opt("RUN_MODE", "full")
DASHBOARD_PORT = int(_env_opt("DASHBOARD_PORT", "17660"))
HTTP_CHART_PORT = int(_env_opt("HTTP_CHART_PORT", "8765"))
SKIP_DASHBOARD = _env_opt("SKIP_DASHBOARD", "false").lower() == "true"

# ══════════════════════════════════════════
# 交易标的
# ══════════════════════════════════════════
INSTRUMENTS = {
    "BTC": {"inst": "BTC-USDT-SWAP", "ct_val": 0.01, "ccy": "BTC", "deribit": "BTC"},
    "ETH": {"inst": "ETH-USDT-SWAP", "ct_val": 0.01, "ccy": "ETH", "deribit": "ETH"},
}

# 多资产相关性 & 对冲分析标的
CORRELATION_ASSETS = {
    "BTC":  {"inst": "BTC-USDT-SWAP", "label": "Bitcoin"},
    "ETH":  {"inst": "ETH-USDT-SWAP", "label": "Ethereum"},
    "SOL":  {"inst": "SOL-USDT-SWAP", "label": "Solana"},
    "XRP":  {"inst": "XRP-USDT-SWAP", "label": "Ripple"},
    "DOGE": {"inst": "DOGE-USDT-SWAP", "label": "Dogecoin"},
    "BNB":  {"inst": "BNB-USDT-SWAP", "label": "BNB"},
    "AVAX": {"inst": "AVAX-USDT-SWAP", "label": "Avalanche"},
    "LINK": {"inst": "LINK-USDT-SWAP", "label": "Chainlink"},
}

EXTERNAL_ASSETS = {
    "XAU":  {"symbol": "PAXGUSDT", "source": "binance", "label": "Gold (PAXG)"},
    "SPX":  {"symbol": "SPX", "source": "yahoo", "label": "S&P 500"},
    "DXY":  {"symbol": "DX-Y.NYB", "source": "yahoo", "label": "US Dollar Index"},
    "VIX":  {"symbol": "^VIX", "source": "yahoo", "label": "Volatility Index"},
}

MACRO_ASSETS = {
    "BTC":   {"symbol": "BTC-USDT-SWAP", "source": "okx",     "label": "BTC 比特币",            "category": "数字资产"},
    "XAU":   {"symbol": "GC=F",           "source": "yahoo",   "label": "黄金  COMEX期货",      "category": "贵金属"},
    "SVR":   {"symbol": "SI=F",           "source": "yahoo",   "label": "白银  COMEX期货",      "category": "贵金属"},
    "PLT":   {"symbol": "PL=F",           "source": "yahoo",   "label": "铂金  NYMEX期货",      "category": "贵金属"},
    "WTI":   {"symbol": "CL=F",           "source": "yahoo",   "label": "WTI原油  NYMEX期货",   "category": "能源"},
    "BNO":   {"symbol": "NG=F",           "source": "yahoo",   "label": "天然气  NYMEX期货",    "category": "能源"},
    "CPR":   {"symbol": "HG=F",           "source": "yahoo",   "label": "铜  COMEX期货",         "category": "工业金属"},
    "ALU":   {"symbol": "ALI=F",          "source": "yahoo",   "label": "铝  LME期货",           "category": "工业金属"},
    "SPX":   {"symbol": "^GSPC",          "source": "yahoo",   "label": "标普500  大盘股",      "category": "美股"},
    "NDQ":   {"symbol": "^IXIC",          "source": "yahoo",   "label": "纳斯达克  科技股",     "category": "美股"},
    "RUT":   {"symbol": "^RUT",           "source": "yahoo",   "label": "罗素2000  小盘股",     "category": "美股"},
    "DJI":   {"symbol": "^DJI",           "source": "yahoo",   "label": "道琼斯  价值股",       "category": "美股"},
    "FTSE":  {"symbol": "^FTSE",          "source": "yahoo",   "label": "英国富时100  FTSE",    "category": "全球股票"},
    "N225":  {"symbol": "^N225",          "source": "yahoo",   "label": "日经225  日本",        "category": "全球股票"},
    "DAX":   {"symbol": "^GDAXI",         "source": "yahoo",   "label": "德国DAX  欧洲",        "category": "全球股票"},
    "HSI":   {"symbol": "^HSI",           "source": "yahoo",   "label": "恒生指数  香港",       "category": "全球股票"},
    "DXY":   {"symbol": "DX-Y.NYB",       "source": "yahoo",   "label": "美元指数  DXY",        "category": "汇率"},
    "EUR":   {"symbol": "EURUSD=X",       "source": "yahoo",   "label": "欧元/美元  EURUSD",     "category": "汇率"},
    "JPY":   {"symbol": "JPY=X",          "source": "yahoo",   "label": "美元/日元  USDJPY",     "category": "汇率"},
    "GBP":   {"symbol": "GBPUSD=X",       "source": "yahoo",   "label": "英镑/美元  GBPUSD",     "category": "汇率"},
    "CNH":   {"symbol": "CNY=X",          "source": "yahoo",   "label": "美元/离岸人民币  USDCNH","category": "汇率"},
    "AUD":   {"symbol": "AUDUSD=X",       "source": "yahoo",   "label": "澳元/美元  AUDUSD",     "category": "汇率"},
    "T2Y":   {"symbol": "ZT=F",           "source": "yahoo",   "label": "2年期美债  短端利率",  "category": "利率"},
    "T10":   {"symbol": "^TNX",           "source": "yahoo",   "label": "10年期美债  长端利率", "category": "利率"},
    "T30":   {"symbol": "ZB=F",           "source": "yahoo",   "label": "30年期美债  超长利率", "category": "利率"},
    "TIP":   {"symbol": "TIP",            "source": "yahoo",   "label": "TIPS  通胀预期",        "category": "利率"},
    "HYG":   {"symbol": "HYG",            "source": "yahoo",   "label": "高收益债  信用利差",   "category": "信用"},
    "LQD":   {"symbol": "LQD",            "source": "yahoo",   "label": "投资级债  信用质量",   "category": "信用"},
    "VIX":   {"symbol": "^VIX",           "source": "yahoo",   "label": "VIX  恐慌指数",         "category": "波动率"},
    "EEM":   {"symbol": "EEM",            "source": "yahoo",   "label": "新兴市场  资金流向",   "category": "另类资产"},
    "REIT":  {"symbol": "VNQ",            "source": "yahoo",   "label": "REITs  不动产",        "category": "另类资产"},
}

# ══════════════════════════════════════════
# 风控参数
# ══════════════════════════════════════════
MAX_POSITION_PCT = float(_env_opt("MAX_POSITION_PCT", "0.30"))
MAX_TOTAL_PCT = float(_env_opt("MAX_TOTAL_PCT", "0.50"))
MAX_LEVERAGE = int(_env_opt("MAX_LEVERAGE", "20"))
DEFAULT_LEVERAGE = int(_env_opt("DEFAULT_LEVERAGE", "10"))
MAX_CONCURRENT = int(_env_opt("MAX_CONCURRENT", "1"))
MAX_DRAWDOWN_PCT = float(_env_opt("MAX_DRAWDOWN_PCT", "0.15"))
STOP_LOSS_PCT = float(_env_opt("STOP_LOSS_PCT", "0.004"))
MIN_PROFIT_PCT = float(_env_opt("MIN_PROFIT_PCT", "0.006"))
TAKER_FEE = float(_env_opt("TAKER_FEE", "0.0005"))

# ══════════════════════════════════════════
# 策略参数
# ══════════════════════════════════════════
CHECK_INTERVAL = int(_env_opt("CHECK_INTERVAL", "30"))
SIGNAL_COOLDOWN = int(_env_opt("SIGNAL_COOLDOWN", "1800"))
SCORE_THRESHOLD = float(_env_opt("SCORE_THRESHOLD", "0.35"))
SCORE_ADD_THRESHOLD = float(_env_opt("SCORE_ADD_THRESHOLD", "0.50"))
MIN_FACTORS_AGREE = int(_env_opt("MIN_FACTORS_AGREE", "4"))
REQUIRE_TREND_ALIGN = _env_opt("REQUIRE_TREND_ALIGN", "true").lower() == "true"

# ── BTC (14因子) ──
W_TREND        = float(_env_opt("W_TREND", "0.04"))
W_ORDERBOOK    = float(_env_opt("W_ORDERBOOK", "0.10"))
W_TAKER        = float(_env_opt("W_TAKER", "0.02"))
W_OI_CHANGE    = float(_env_opt("W_OI_CHANGE", "0.01"))
W_FUNDING      = float(_env_opt("W_FUNDING", "0.10"))
W_MAXPAIN      = float(_env_opt("W_MAXPAIN", "0.08"))
W_VOL_DELTA    = float(_env_opt("W_VOL_DELTA", "0.03"))
W_BTC_CORR     = float(_env_opt("W_BTC_CORR", "0.02"))
W_GAMMA        = float(_env_opt("W_GAMMA", "0.02"))
W_IV           = float(_env_opt("W_IV", "0.02"))
W_TAKER_EXHAUST= float(_env_opt("W_TAKER_EXHAUST", "0.18"))
W_LIQ_COOLDOWN = float(_env_opt("W_LIQ_COOLDOWN", "0.04"))
LIQ_PROXIMITY_BOOST = float(_env_opt("LIQ_PROXIMITY_BOOST", "3.0"))
LIQ_PROXIMITY_MIN_USD = int(_env_opt("LIQ_PROXIMITY_MIN_USD", "1000000"))
W_MEAN_REVERT  = float(_env_opt("W_MEAN_REVERT", "0.01"))
W_SMART_MONEY  = float(_env_opt("W_SMART_MONEY", "0.03"))
W_MTF_RESONANCE  = float(_env_opt("W_MTF_RESONANCE", "0.10"))
W_OB_LIQ_RATIO   = float(_env_opt("W_OB_LIQ_RATIO", "0.08"))
W_LOW_LEVERAGE   = float(_env_opt("W_LOW_LEVERAGE", "0.04"))
W_LIQ_EXHAUSTION = float(_env_opt("W_LIQ_EXHAUSTION", "0.06"))
W_PRE_FILTER     = float(_env_opt("W_PRE_FILTER", "0.00"))
# 新增因子
W_RETAIL_POSITION   = float(_env_opt("W_RETAIL_POSITION", "0.05"))
W_MM_POSITION       = float(_env_opt("W_MM_POSITION", "0.05"))
W_LIQ_TRIGGER       = float(_env_opt("W_LIQ_TRIGGER", "0.06"))
W_TOXIC_FLOW        = float(_env_opt("W_TOXIC_FLOW", "0.06"))

# ── XAU (14因子) ──
W_XAU_TREND    = float(_env_opt("W_XAU_TREND", "0.06"))
W_XAU_MTF      = float(_env_opt("W_XAU_MTF", "0.06"))
W_XAU_MA_ALIGN = float(_env_opt("W_XAU_MA_ALIGN", "0.04"))
W_XAU_MOMENTUM = float(_env_opt("W_XAU_MOMENTUM", "0.04"))
W_XAU_VOLUME   = float(_env_opt("W_XAU_VOLUME", "0.08"))
W_XAU_OI       = float(_env_opt("W_XAU_OI", "0.06"))
W_XAU_COT      = float(_env_opt("W_XAU_COT", "0.06"))
W_XAU_VOL_DIV  = float(_env_opt("W_XAU_VOL_DIV", "0.04"))
W_XAU_REAL_RATE= float(_env_opt("W_XAU_REAL_RATE", "0.10"))
W_XAU_DXY_INV  = float(_env_opt("W_XAU_DXY_INV", "0.10"))
W_XAU_ETF_FLOW = float(_env_opt("W_XAU_ETF_FLOW", "0.06"))
W_XAU_CREDIT   = float(_env_opt("W_XAU_CREDIT", "0.06"))
W_XAU_RSI      = float(_env_opt("W_XAU_RSI", "0.10"))
W_XAU_BB       = float(_env_opt("W_XAU_BB", "0.08"))
W_XAU_EXHAUST  = float(_env_opt("W_XAU_EXHAUST", "0.06"))

ASSET_FACTOR_CONFIG = {
    "BTC": {
        "factors": {
            "trend":       ("TR",  W_TREND),
            "orderbook":   ("OB",  W_ORDERBOOK),
            "funding":     ("FR",  W_FUNDING),
            "taker":       ("TK",  W_TAKER),
            "oi":          ("OI",  W_OI_CHANGE),
            "maxpain":     ("MP",  W_MAXPAIN),
            "vol_delta":   ("VD",  W_VOL_DELTA),
            "btc_corr":    ("BTC", W_BTC_CORR),
            "gamma":       ("GM",  W_GAMMA),
            "iv":          ("IV",  W_IV),
            "exhaust":     ("EX",  W_TAKER_EXHAUST),
            "liq_cool":    ("LC",  W_LIQ_COOLDOWN),
            "mean_revert": ("MR",  W_MEAN_REVERT),
            "smart_money": ("SM",  W_SMART_MONEY),
            "mtf":         ("MTF", W_MTF_RESONANCE),
            "ob_liq":      ("OBL", W_OB_LIQ_RATIO),
            "low_lev":     ("LL",  W_LOW_LEVERAGE),
            "liq_ex":      ("LEX", W_LIQ_EXHAUSTION),
            "retail":      ("RT",  W_RETAIL_POSITION),
            "mm":          ("MM",  W_MM_POSITION),
            "liq_trigger": ("LT",  W_LIQ_TRIGGER),
            "toxic":       ("TX",  W_TOXIC_FLOW),
        },
        "score_threshold": SCORE_THRESHOLD,
        "stop_loss_pct": STOP_LOSS_PCT,
    },
    "XAU": {
        "factors": {
            "trend":       ("XTR", W_XAU_TREND),
            "mtf":         ("XMF", W_XAU_MTF),
            "ma_align":    ("XMA", W_XAU_MA_ALIGN),
            "momentum":    ("XMO", W_XAU_MOMENTUM),
            "volume":      ("XVL", W_XAU_VOLUME),
            "oi":          ("XOI", W_XAU_OI),
            "cot":         ("XCF", W_XAU_COT),
            "vol_div":     ("XVX", W_XAU_VOL_DIV),
            "real_rate":   ("XRD", W_XAU_REAL_RATE),
            "dxy_inv":     ("XDX", W_XAU_DXY_INV),
            "etf_flow":    ("XEF", W_XAU_ETF_FLOW),
            "credit":      ("XCR", W_XAU_CREDIT),
            "rsi":         ("XRSI",W_XAU_RSI),
            "bb":          ("XBB", W_XAU_BB),
            "exhaust":     ("XEX", W_XAU_EXHAUST),
        },
        "score_threshold": float(_env_opt("XAU_SCORE_THRESHOLD", "0.40")),
        "stop_loss_pct": float(_env_opt("XAU_STOP_LOSS_PCT", "0.003")),
    },
}

# ══════════════════════════════════════════
# 猎杀系统参数
# ══════════════════════════════════════════
PRE_FILTER_THRESHOLD = float(_env_opt("PRE_FILTER_THRESHOLD", "0.40"))
MTF_REQUIRE_ALL = _env_opt("MTF_REQUIRE_ALL", "true").lower() == "true"
MTF_MIN_SCORE = float(_env_opt("MTF_MIN_SCORE", "0.40"))
MANUAL_TRADE_COOLDOWN = int(_env_opt("MANUAL_TRADE_COOLDOWN", "57600"))
TWO_STRIKE_COOLDOWN = int(_env_opt("TWO_STRIKE_COOLDOWN", "57600"))
MAX_MANUAL_SESSION = int(_env_opt("MAX_MANUAL_SESSION", "10800"))
MANUAL_IDLE_TIMEOUT = int(_env_opt("MANUAL_IDLE_TIMEOUT", "1800"))
LIQ_EXHAUST_DECLINES = int(_env_opt("LIQ_EXHAUST_DECLINES", "3"))
LIQ_EXHAUST_MIN_USD = int(_env_opt("LIQ_EXHAUST_MIN_USD", "100000"))
LOW_LEV_THRESHOLD = int(_env_opt("LOW_LEV_THRESHOLD", "5"))
US_SESSION_START_UTC = int(_env_opt("US_SESSION_START_UTC", "14"))
US_SESSION_END_UTC = int(_env_opt("US_SESSION_END_UTC", "21"))

# ══════════════════════════════════════════
# 链上跟单
# ══════════════════════════════════════════
COPY_TRADE_ENABLED = _env_opt("COPY_TRADE_ENABLED", "true").lower() == "true"
COPY_TRADE_WEIGHT = float(_env_opt("COPY_TRADE_WEIGHT", "0.10"))
COPY_TRADE_ADDRESSES = [
    {"addr": "0xf584F8728B874a6a5c7A8d4d387C9aae9172D621", "label": "Jump Trading", "weight": 1.0},
    {"addr": "0x00000000AE347930bD1E7B0F35588b92280f9e75", "label": "Wintermute", "weight": 1.0},
]

# ══════════════════════════════════════════
# 文件路径
# ══════════════════════════════════════════
_BASE_DIR = _os.path.dirname(_os.path.abspath(__file__))
LOG_FILE   = _os.path.join(_BASE_DIR, "my_trader.log")
STATE_FILE = _env_opt("STATE_FILE", _os.path.join(_BASE_DIR, "data", "trader_state.json"))

# ══════════════════════════════════════════
# 代理配置
# ══════════════════════════════════════════
def _detect_proxy():
    http_proxy = _os.environ.get("HTTP_PROXY", "")
    https_proxy = _os.environ.get("HTTPS_PROXY", "")
    if http_proxy or https_proxy:
        proxies = {}
        if http_proxy: proxies["http"] = http_proxy
        if https_proxy: proxies["https"] = https_proxy
        return proxies
    if _os.environ.get("SKIP_PROXY_DETECT", "").lower() == "true":
        return {}
    return {}

PROXIES = _detect_proxy()

# ══════════════════════════════════════════
# 日志
# ══════════════════════════════════════════
LOG_LEVEL = getattr(logging, _env_opt("LOG_LEVEL", "INFO").upper())
logging.basicConfig(
    level=LOG_LEVEL,
    format='%(asctime)s [%(name)s] %(levelname)s: %(message)s',
    handlers=[logging.FileHandler(LOG_FILE, encoding="utf-8"), logging.StreamHandler()]
)
logger = logging.getLogger("MyTrader")