"""Tests for safety interlocks."""

from __future__ import annotations

import unittest
from datetime import datetime, timezone

from control.config import ControlConfig
from control.safety import check_heat_allowed, temps_fresh
from control.state import ControlState


def _reading(**kwargs: object) -> dict:
    base = {
        "ts": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
        "setup_state": "ready",
        "tub_avg_f": 95.0,
        "hot_in_f": 110.0,
    }
    base.update(kwargs)
    return base


class TestSafety(unittest.TestCase):
    def setUp(self) -> None:
        self.cfg = ControlConfig()
        self.state = ControlState(target_f=102.0)

    def test_stale_temps_block(self) -> None:
        old = {"ts": "2020-01-01T00:00:00Z", "tub_avg_f": 90.0, "setup_state": "ready"}
        self.assertFalse(temps_fresh(old, self.cfg))
        r = check_heat_allowed(self.state, self.cfg, old)
        self.assertFalse(r.allow_heat)

    def test_need_reinstall_blocks(self) -> None:
        r = check_heat_allowed(self.state, self.cfg, _reading(setup_state="need_reinstall"))
        self.assertFalse(r.allow_heat)

    def test_at_target_blocks(self) -> None:
        r = check_heat_allowed(self.state, self.cfg, _reading(tub_avg_f=102.0))
        self.assertFalse(r.allow_heat)

    def test_ok_below_target(self) -> None:
        r = check_heat_allowed(self.state, self.cfg, _reading(tub_avg_f=96.0))
        self.assertTrue(r.allow_heat)


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