"""中控监控区今日统计聚合."""
import unittest

from lib.hub.hub_monitor_totals_lib import aggregate_monitor_board_totals
from lib.hub.hub_trades_lib import summarize_trades


class TestHubMonitorTotals(unittest.TestCase):
    def test_aggregate_monitor_board_totals_sums_rows(self):
        rows = [
            {
                "day_stats": {
                    "ok": True,
                    "opens_today": 2,
                    "trade_stats": {
                        "closed_count": 1,
                        "win_count": 1,
                        "loss_count": 0,
                        "win_pnl_u": 5.5,
                        "loss_pnl_u": 0,
                    },
                },
                "agent": {"positions": [{"contracts": 1}], "total_unrealized_pnl": 1.2},
            },
            {
                "day_stats": {
                    "ok": True,
                    "opens_today": 1,
                    "trade_stats": {
                        "closed_count": 2,
                        "win_count": 0,
                        "loss_count": 2,
                        "win_pnl_u": 0,
                        "loss_pnl_u": -3.0,
                    },
                },
                "agent": {"positions": [], "total_unrealized_pnl": 0},
            },
        ]
        out = aggregate_monitor_board_totals(rows, trading_day="2026-07-04", reset_hour=8)
        self.assertEqual(out["open_count"], 3)
        self.assertEqual(out["closed_count"], 3)
        self.assertEqual(out["win_count"], 1)
        self.assertEqual(out["loss_count"], 2)
        self.assertEqual(out["win_pnl_u"], 5.5)
        self.assertEqual(out["loss_pnl_u"], -3.0)
        self.assertEqual(out["open_position_count"], 1)
        self.assertEqual(out["float_pnl_u"], 1.2)

    def test_aggregate_monitor_board_totals_includes_options(self):
        rows = [
            {
                "capabilities": ["options"],
                "options": {
                    "ok": True,
                    "enabled": True,
                    "positions": [{"inst_id": "X"}, {"inst_id": "Y"}],
                    "upl_total_usdc": 1.5,
                },
                "agent": {"positions": [], "total_unrealized_pnl": 0},
            }
        ]
        out = aggregate_monitor_board_totals(rows, trading_day="2026-07-04", reset_hour=8)
        self.assertEqual(out["options_open_position_count"], 2)
        self.assertEqual(out["open_position_count"], 2)
        self.assertEqual(out["options_float_pnl_u"], 1.5)
        self.assertEqual(out["float_pnl_u"], 1.5)

    def test_aggregate_excludes_option_like_agent_positions(self):
        """子代理误把期权当永续上报时:不算进持仓数,浮盈只用期权 snap."""
        rows = [
            {
                "capabilities": ["options"],
                "options": {
                    "ok": True,
                    "enabled": True,
                    "positions": [{"inst_id": "ETH-USD-260806-1875-C"}],
                    "upl_total_usdc": -0.4,
                },
                "agent": {
                    "positions": [
                        {
                            "symbol": "ETH/USD:USD-260806-1875-C",
                            "contracts": 66,
                            "unrealized_pnl": 27.6,
                        },
                        {
                            "symbol": "BTC/USDT:USDT",
                            "contracts": 1,
                            "unrealized_pnl": -4.66,
                        },
                    ],
                    "total_unrealized_pnl": 22.94,
                },
            }
        ]
        out = aggregate_monitor_board_totals(rows, trading_day="2026-08-05", reset_hour=8)
        self.assertEqual(out["open_position_count"], 2)
        self.assertEqual(out["options_open_position_count"], 1)
        self.assertEqual(out["options_float_pnl_u"], -0.4)
        self.assertEqual(out["float_pnl_u"], round(-4.66 + (-0.4), 4))

    def test_summarize_trades_win_loss_amounts(self):
        stats = summarize_trades(
            [{"pnl_amount": 2.5}, {"pnl_amount": -1.0}, {"pnl_amount": 0}]
        )
        self.assertEqual(stats["win_count"], 1)
        self.assertEqual(stats["loss_count"], 1)
        self.assertEqual(stats["win_pnl_u"], 2.5)
        self.assertEqual(stats["loss_pnl_u"], -1.0)


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