import sys
import unittest
from pathlib import Path

import pandas as pd

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

import xsmom_28d_v2_strategy_parity as mod  # noqa: E402


class SignalKeysTest(unittest.TestCase):
    def test_uses_five_minute_eligible_time(self):
        frames = {
            "BTC/USDT:USDT": pd.DataFrame(
                {
                    "date": pd.to_datetime(["2026-01-01T23:55:00Z"]),
                    "enter_short": [1],
                }
            )
        }
        keys = mod.signal_keys(
            frames,
            columns=(("short", "enter_short"),),
            window_start=pd.Timestamp("2026-01-02T00:00:00Z"),
            window_end=pd.Timestamp("2026-01-03T00:00:00Z"),
        )
        self.assertEqual(
            keys,
            {("2026-01-02T00:00:00+00:00", "BTC/USDT:USDT", "short")},
        )


class CompareSetsTest(unittest.TestCase):
    def test_exact_parity_and_unscored_retention(self):
        scored = ("2026-01-01T00:05:00+00:00", "BTC/USDT:USDT", "short")
        unscored = ("2026-01-01T00:10:00+00:00", "POWER/USDT:USDT", "short")
        raw = {scored, unscored}
        summary, mismatches = mod.compare_sets(
            baseline_raw=raw,
            noop_raw=raw,
            noop_retained=raw,
            candidate_raw=raw,
            candidate_retained={unscored},
            coverage_passed={unscored},
            coverage_unscored={unscored},
            expected_raw_count=2,
        )
        self.assertTrue(summary["all_strategy_parity_gates"])
        self.assertEqual(mismatches, [])

    def test_candidate_extra_signal_is_detected(self):
        raw = {("2026-01-01T00:05:00+00:00", "BTC/USDT:USDT", "short")}
        extra = ("2026-01-01T00:10:00+00:00", "ETH/USDT:USDT", "short")
        summary, mismatches = mod.compare_sets(
            baseline_raw=raw,
            noop_raw=raw,
            noop_retained=raw,
            candidate_raw=raw | {extra},
            candidate_retained=set(),
            coverage_passed=set(),
            coverage_unscored=set(),
            expected_raw_count=1,
        )
        self.assertFalse(summary["all_strategy_parity_gates"])
        self.assertEqual(len(mismatches), 1)


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