import tempfile
import unittest
from datetime import datetime
from pathlib import Path

from screener_tradingview_common import attach_detection_state


def _detail(status, price):
    return {
        "ticker": "AAA",
        "status": status,
        "screening_status": "KANDIDAT FULL PA",
        "price": price,
        "score": 80,
        "selection_score": 80,
        "vol_ratio": 1.8,
    }


class TrendBreakConfirmLockTests(unittest.TestCase):
    def test_confirm_lock_survives_downgrade_and_missing_scan(self):
        with tempfile.TemporaryDirectory() as tmp:
            state_path = str(Path(tmp) / "detection.json")
            output_path = str(Path(tmp) / "results.json")

            near = attach_detection_state(
                [_detail("NEAR", 100)],
                now=datetime(2026, 8, 25, 9, 0),
                state_path=state_path,
                output_path=output_path,
                phase="LIVE",
            )
            self.assertEqual(near[0][0]["status"], "NEAR")
            self.assertFalse(near[3]["confirm_locks"])

            confirmed = attach_detection_state(
                [_detail("CONFIRM", 110)],
                now=datetime(2026, 8, 25, 9, 1),
                state_path=state_path,
                output_path=output_path,
                phase="LIVE",
            )
            confirmed_row = confirmed[0][0]
            self.assertEqual(confirmed_row["status"], "CONFIRM")
            self.assertTrue(confirmed_row["confirm_locked"])
            self.assertEqual(confirmed_row["confirm_locked_price"], 110.0)
            self.assertEqual(confirmed[3]["confirm_entered_tickers"], ["AAA"])

            downgraded = attach_detection_state(
                [_detail("NEAR", 111)],
                now=datetime(2026, 8, 25, 9, 2),
                state_path=state_path,
                output_path=output_path,
                phase="LIVE",
            )
            downgraded_row = downgraded[0][0]
            self.assertEqual(downgraded_row["status"], "CONFIRM")
            self.assertEqual(downgraded_row["confirm_current_status"], "NEAR")
            self.assertEqual(downgraded_row["confirm_locked_at"], "2026-08-25T09:01:00")
            self.assertEqual(downgraded_row["price"], 111.0)

            missing = attach_detection_state(
                [],
                now=datetime(2026, 8, 25, 9, 3),
                state_path=state_path,
                output_path=output_path,
                phase="LIVE",
            )
            missing_row = missing[0][0]
            self.assertEqual(missing_row["status"], "CONFIRM")
            self.assertTrue(missing_row["confirm_locked"])
            self.assertTrue(missing_row["retained_today"])
            self.assertFalse(missing_row["currently_qualified"])
            self.assertEqual(missing_row["confirm_current_status"], "NOT_IN_CURRENT_SCAN")

    def test_near_candidate_is_not_confirm_locked(self):
        with tempfile.TemporaryDirectory() as tmp:
            rows, _entered, _exited, state = attach_detection_state(
                [_detail("NEAR", 100)],
                now=datetime(2026, 8, 25, 9, 0),
                state_path=str(Path(tmp) / "detection.json"),
                output_path=str(Path(tmp) / "results.json"),
                phase="LIVE",
            )
            self.assertFalse(rows[0]["confirm_locked"])
            self.assertEqual(state["confirm_locks"], {})


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