from __future__ import annotations

from app.notify.wecom import (
    TAG_CLOSE,
    TAG_OPEN,
    build_markdown,
    close_reason_zh,
    direction_zh,
    notify_close,
    notify_open,
    venue_label,
)


def test_build_markdown_has_tag_and_title(monkeypatch):
    monkeypatch.setattr("app.notify.wecom.venue_label", lambda: "实盘·OKX")
    md = build_markdown(tag=TAG_OPEN, title="开仓成功", lines=["组: G-1"])
    assert "【实盘·OKX】开仓成功" in md
    assert "`OPEN`" in md
    assert "组: G-1" in md


def test_venue_label_sim(monkeypatch):
    class S:
        is_sim = True
        exchange = "okx"

    monkeypatch.setattr("app.notify.wecom.get_settings", lambda: S())
    assert venue_label() is None


def test_direction_and_close_reason_zh() -> None:
    assert "Put" in direction_zh({"option_side": "put", "perp_side": "long"})
    assert close_reason_zh("liquidity_retry") == "等待流动性后全平"
    assert close_reason_zh("fixed_usdt") == "固定净盈利达标·双腿全平"


def test_notify_open_close_markdown(monkeypatch) -> None:
    captured: list[str] = []

    monkeypatch.setattr("app.notify.wecom.wecom_enabled", lambda: True)
    monkeypatch.setattr("app.notify.wecom.wecom_webhook_url", lambda: "http://example.test")
    monkeypatch.setattr("app.notify.wecom.venue_label", lambda: None)
    monkeypatch.setattr("app.notify.wecom.wecom_machine_name", lambda: "")

    def _capture(content: str):
        captured.append(content)
        return True, "ok"

    monkeypatch.setattr("app.notify.wecom._post_markdown_sync", _capture)
    monkeypatch.setattr(
        "app.notify.wecom.notify_async",
        lambda content: captured.append(content),
    )

    notify_open(
        group_id="G-20260802-01",
        detail="opened",
        extra={
            "bias": "put_ask_gt_call",
            "option_side": "put",
            "perp_side": "long",
            "option_inst_id": "ETH-USD-260802-1850-P",
            "strike": 1850,
            "expiry_ymd": "260802",
            "perp_qty_eth": 1.0,
            "option_qty_eth": 2.0,
            "perp_entry_px": 1860.5,
            "option_entry_px": 12.3,
            "initial_premium": 24.6,
            "perp_margin": 620.0,
            "leverage": 3,
        },
    )
    assert captured
    open_md = captured[-1]
    assert "开仓成功" in open_md
    assert "`OPEN`" in open_md or TAG_OPEN in open_md
    assert "权利金占用" in open_md
    assert "保证金占用" in open_md
    assert "开仓数量" in open_md
    assert "买Put" in open_md

    captured.clear()
    notify_close(
        reason="liquidity_retry",
        detail="closed",
        data={
            "group_id": "G-20260802-01",
            "perp_pnl": -10.5,
            "option_pnl": 40.2,
            "net": 25.0,
            "fees": 4.5,
        },
    )
    close_md = captured[-1]
    assert "平仓" in close_md
    assert TAG_CLOSE in close_md or "`CLOSE`" in close_md
    assert "等待流动性后全平" in close_md
    assert "永续盈亏" in close_md
    assert "期权盈亏" in close_md
    assert "净利润" in close_md
    assert "+25.00U" in close_md or "25.00U" in close_md
