"""三所趋势 enrich:实例与中控 monitor 字段一致."""
from __future__ import annotations

import json
import sys
import unittest
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))

from lib.strategy.strategy_trend_register import (  # noqa: E402
    enrich_trend_plan,
    enrich_trend_plan_for_hub,
)


class _FakeModule:
    @staticmethod
    def normalize_exchange_symbol(sym):
        return sym

    @staticmethod
    def ensure_markets_loaded():
        return None

    @staticmethod
    def get_live_position_exchange_metrics(ex_sym, direction, order_leverage=None):
        return {
            "entry_price": 0.3507,
            "mark_price": 0.3431,
            "unrealized_pnl": -1.23,
        }

    @staticmethod
    def get_contract_size(_ex_sym):
        return 1.0


class TestTrendHubEnrichUnified(unittest.TestCase):
    def _cfg(self):
        return {
            "app_module": _FakeModule(),
            "breakeven_offset_pct": 0.3,
            "row_to_dict": lambda row: dict(row) if not isinstance(row, dict) else row,
        }

    def _plan_row(self):
        return {
            "id": 4,
            "symbol": "ONDO/USDT:USDT",
            "exchange_symbol": "ONDO/USDT:USDT",
            "direction": "long",
            "stop_loss": 0.329,
            "take_profit": 0.476,
            "add_upper": 0.35,
            "first_order_amount": 115,
            "snapshot_available_usdt": 97.98,
            "risk_percent": 5,
            "contract_size": 1.0,
            "grid_prices_json": json.dumps([0.343, 0.343, 0.3395, 0.336, 0.3325]),
            "leg_amounts_json": json.dumps([23, 23, 23, 23, 23]),
            "dca_legs": 5,
            "first_order_done": 1,
            "legs_done": 2,
            "avg_entry_price": 0.3434,
            "order_amount_open": 161,
            "leg_fill_prices_json": json.dumps([0.3436]),
            "leverage": 10,
            "plan_margin_capital": 8.17,
        }

    def test_hub_and_page_share_live_avg_and_dca_levels(self):
        cfg = self._cfg()
        row = self._plan_row()
        page = enrich_trend_plan(cfg, row)
        hub = enrich_trend_plan_for_hub(cfg, row)
        self.assertAlmostEqual(page["avg_entry_price"], 0.3507, places=4)
        self.assertAlmostEqual(hub["avg_entry_price"], 0.3507, places=4)
        self.assertIn("dca_levels", page)
        self.assertIn("dca_levels", hub)
        last_done = hub["dca_levels"][2]
        self.assertEqual(last_done["status"], "done")
        self.assertAlmostEqual(last_done["price"], 0.343, places=4)
        self.assertAlmostEqual(last_done["avg_entry"], 0.3507, places=4)
        self.assertLess(last_done["price"], 0.36)
        self.assertEqual(hub.get("monitor_source"), "趋势回调计划")
        self.assertEqual(hub.get("add_count"), 2)


if __name__ == "__main__":
    unittest.main()
