"""journal_form_lib / strategy_trade_labels 下单类型与开仓类型拆分."""
from __future__ import annotations

import unittest

from lib.instance.journal_form_lib import (
    journal_entry_reason_valid,
    normalize_journal_direction,
    normalize_journal_entry_reason,
)
from lib.strategy.strategy_trade_labels import (
    JOURNAL_ORDER_TYPE_OPTIONS,
    normalize_journal_order_type,
    order_type_from_monitor_type,
)
from lib.trade.entry_model_lib import build_journal_entry_reason_options


class JournalFormLibTests(unittest.TestCase):
    def test_journal_entry_reason_excludes_legacy_style_and_strategy(self):
        opts = build_journal_entry_reason_options()
        self.assertIn("反转/启动A", opts)
        self.assertNotIn("趋势单", opts)
        self.assertNotIn("波段单", opts)
        self.assertNotIn("趋势回调", opts)
        self.assertNotIn("顺势加仓", opts)

    def test_normalize_journal_entry_reason_rejects_legacy_for_new_submit(self):
        opts = build_journal_entry_reason_options()
        self.assertEqual(
            normalize_journal_entry_reason("趋势单", opts, allow_legacy=False),
            "",
        )
        self.assertEqual(
            normalize_journal_entry_reason("趋势回调", opts, allow_legacy=False),
            "",
        )

    def test_normalize_journal_entry_reason_accepts_legacy_when_allowed(self):
        opts = build_journal_entry_reason_options()
        self.assertEqual(
            normalize_journal_entry_reason("趋势单", opts, allow_legacy=True),
            "趋势单",
        )

    def test_order_type_from_monitor_type(self):
        self.assertEqual(order_type_from_monitor_type("下单监控"), "下单监控")
        self.assertEqual(order_type_from_monitor_type("关键位监控"), "关键位监控")
        self.assertEqual(order_type_from_monitor_type("趋势回调"), "趋势回调")
        self.assertEqual(order_type_from_monitor_type("顺势加仓"), "顺势加仓")

    def test_normalize_journal_order_type(self):
        self.assertEqual(normalize_journal_order_type("顺势加仓"), "顺势加仓")
        self.assertEqual(normalize_journal_order_type(""), "")
        self.assertEqual(len(JOURNAL_ORDER_TYPE_OPTIONS), 4)

    def test_journal_entry_reason_valid(self):
        opts = build_journal_entry_reason_options()
        self.assertTrue(journal_entry_reason_valid("顺势/大分歧A", opts))
        self.assertFalse(journal_entry_reason_valid("趋势单", opts))

    def test_normalize_journal_direction(self):
        self.assertEqual(normalize_journal_direction("short"), "short")
        self.assertEqual(normalize_journal_direction("做空"), "short")
        self.assertEqual(normalize_journal_direction("long"), "long")
        self.assertEqual(normalize_journal_direction("做多"), "long")
        self.assertEqual(normalize_journal_direction(""), "")


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