"""把 output/spx/sell/trade_actions.csv 转成 JSON 给 dashboard 显示."""
from __future__ import annotations

import json
from pathlib import Path

import pandas as pd

ROOT = Path(__file__).resolve().parent.parent
OUTPUT = Path(__file__).resolve().parent / "trade_actions_data.json"
ACTIONS_PATH = ROOT / "output" / "spx" / "sell" / "trade_actions.csv"


def main():
    df = pd.read_csv(ACTIONS_PATH)
    # 规范化字段 (处理可能缺失的列)
    records = []
    for _, r in df.iterrows():
        # 跳过空白分隔行 (不同周期之间的 empty row)
        date_val = r.get("date")
        if pd.isna(date_val) or str(date_val).strip() in ("", "nan"):
            continue
        rec = {
            "date": str(r.get("date", "")),
            "action": str(r.get("动作", "")),
            "spx": float(r["SPX"]) if pd.notna(r.get("SPX")) else None,
            "detail": str(r["信号详情"]) if pd.notna(r.get("信号详情")) else "",
            "cycle": int(r["卖出周期"]) if pd.notna(r.get("卖出周期")) else None,
            "peak_anchor": float(r["前高锚点"]) if pd.notna(r.get("前高锚点")) else None,
            "result": str(r["result"]) if pd.notna(r.get("result")) else "",
            "dd_from_peak": float(r["距高点%"]) if pd.notna(r.get("距高点%")) else None,
            "false_alarm": str(r["虚惊"]) if pd.notna(r.get("虚惊")) else "",
        }
        records.append(rec)
    output = {
        "generated_at": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S"),
        "source": str(ACTIONS_PATH.relative_to(ROOT)),
        "total": len(records),
        "actions": records,
    }
    OUTPUT.write_text(json.dumps(output, ensure_ascii=False), encoding="utf-8")
    size_kb = OUTPUT.stat().st_size / 1024
    print(f"✅ 保存: {OUTPUT} ({size_kb:.0f} KB, {len(records)} 条)")


if __name__ == "__main__":
    main()
