import sys
import tempfile
import unittest
from pathlib import Path


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

import slippage_audit  # noqa: E402


class SlippageAuditTest(unittest.TestCase):
    def test_percentile_interpolates(self):
        values = [2.2, 3.4, 4.7, 7.6, 27.6, 53.4, 56.6, 62.0, 287.4]
        self.assertEqual(slippage_audit.percentile(values, 0.5), 27.6)
        self.assertAlmostEqual(slippage_audit.percentile(values, 0.9), 107.08)

    def test_percentile_rejects_empty_input(self):
        with self.assertRaises(ValueError):
            slippage_audit.percentile([], 0.5)

    def test_normalize_since_converts_offset_to_utc(self):
        self.assertEqual(
            slippage_audit.normalize_since("2026-07-17T11:49:02+08:00"),
            "2026-07-17 03:49:02.000000",
        )

    def test_recovers_deleted_timeout_after_cutoff(self):
        content = "\n".join(
            [
                "2026-07-15 12:40:12,556 - freqtrade.freqtradebot - INFO - Sell order fully cancelled. Removing Trade(id=12, pair=POWER/USDT:USDT, amount=0, is_short=True, leverage=2, open_rate=0.0786, open_since=2026-07-15 12:30:09) from database.",
                "2026-07-17 04:00:12,556 - freqtrade.freqtradebot - INFO - Buy order fully cancelled. Removing Trade(id=15, pair=BTC/USDT:USDT, amount=0, is_short=False, leverage=2, open_rate=65000.0, open_since=2026-07-17 03:50:09) from database.",
            ]
        )
        with tempfile.TemporaryDirectory() as temp_dir:
            log = Path(temp_dir) / "freqtrade.log"
            log.write_text(content, encoding="utf-8")
            rows = slippage_audit.parse_deleted_entry_timeouts(
                str(log), "2026-07-17 03:49:02.000000"
            )
        self.assertEqual(len(rows), 1)
        self.assertEqual(rows[0]["pair"], "BTC/USDT:USDT")
        self.assertEqual(rows[0]["side"], "long")

    def test_multiple_logs_are_deduplicated(self):
        content = (
            "2026-07-18 01:02:03,456 - freqtrade.freqtradebot - INFO - "
            "Sell order fully cancelled. Removing Trade(id=9, "
            "pair=POWER/USDT:USDT, amount=0, is_short=True, leverage=2, "
            "open_rate=0.123, open_since=2026-07-18 00:52:03) from database."
        )
        with tempfile.TemporaryDirectory() as temp_dir:
            first = Path(temp_dir) / "freqtrade.log.1"
            second = Path(temp_dir) / "freqtrade.log"
            first.write_text(content, encoding="utf-8")
            second.write_text(content, encoding="utf-8")
            rows = slippage_audit.parse_deleted_entry_timeouts(
                [str(first), str(second)], "2026-07-17 00:00:00"
            )
        self.assertEqual(len(rows), 1)
        self.assertEqual(rows[0]["pair"], "POWER/USDT:USDT")


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