from __future__ import annotations

import json
from pathlib import Path

from src.tools.tradingview_strategy_performance import summarize_strategy_performance, recommend_strategy_actions


def _append(path: Path, row: dict) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    with path.open("a", encoding="utf-8") as fh:
        fh.write(json.dumps(row) + "\n")


def test_strategy_performance_summarizes_winrate_and_pnl(tmp_path):
    journal = tmp_path / "experiments" / "tradingview_paper_bridge" / "trade_journal.jsonl"
    _append(journal, {"event": "paper_exit", "strategy_id": "gaussian_channel_v1", "coin": "BTC", "net_pnl_usd": "0.50"})
    _append(journal, {"event": "paper_exit", "strategy_id": "gaussian_channel_v1", "coin": "BTC", "net_pnl_usd": "-0.10"})
    _append(journal, {"event": "paper_exit", "strategy_id": "squeeze_breakout_1h", "coin": "ETH", "net_pnl_usd": "0.20"})

    summary = summarize_strategy_performance(tmp_path)

    assert summary["overall"]["closed_trades"] == 3
    assert summary["overall"]["net_pnl_usd"] == "0.60"
    assert summary["strategies"]["gaussian_channel_v1"]["closed_trades"] == 2
    assert summary["strategies"]["gaussian_channel_v1"]["wins"] == 1
    assert summary["strategies"]["gaussian_channel_v1"]["winrate_pct"] == "50.00"
    assert summary["coins"]["BTC"]["net_pnl_usd"] == "0.40"


def test_strategy_recommendation_requires_sample_size_before_shadow(tmp_path):
    journal = tmp_path / "experiments" / "tradingview_paper_bridge" / "trade_journal.jsonl"
    _append(journal, {"event": "paper_exit", "strategy_id": "small_sample", "coin": "BTC", "net_pnl_usd": "0.50"})

    summary = summarize_strategy_performance(tmp_path)
    recs = recommend_strategy_actions(summary, min_closed_trades=3)

    assert recs["small_sample"] == "continue_paper_too_few_trades"


def test_strategy_recommendation_flags_positive_and_negative_strategies(tmp_path):
    journal = tmp_path / "experiments" / "tradingview_paper_bridge" / "trade_journal.jsonl"
    for i, pnl in enumerate(["0.30", "0.20", "0.10"]):
        _append(journal, {"event": "paper_exit", "strategy_id": "good", "coin": "BTC", "net_pnl_usd": pnl})
    for i, pnl in enumerate(["-0.30", "-0.20", "0.01"]):
        _append(journal, {"event": "paper_exit", "strategy_id": "bad", "coin": "SOL", "net_pnl_usd": pnl})

    recs = recommend_strategy_actions(summarize_strategy_performance(tmp_path), min_closed_trades=3)

    assert recs["good"] == "shadow_candidate_not_live"
    assert recs["bad"] == "pause_or_rework"
