"""Tests for control health status vs temperature setup state."""

from __future__ import annotations

import unittest
from datetime import datetime, timezone

from control.config import ControlConfig
from control.daemon import _health_status
from control.state import ControlState


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


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

    def test_ready_ok(self) -> None:
        status, detail = _health_status(self.state, self.cfg, _reading())
        self.assertEqual(status, "ok")
        self.assertEqual(detail, "loop running")

    def test_need_hot_in_degraded(self) -> None:
        status, detail = _health_status(
            self.state, self.cfg, _reading(setup_state="need_hot_in", tub_avg_f=None)
        )
        self.assertEqual(status, "degraded")
        self.assertIn("need_hot_in", detail)

    def test_need_water_degraded(self) -> None:
        status, _ = _health_status(self.state, self.cfg, _reading(setup_state="need_water", tub_avg_f=None))
        self.assertEqual(status, "degraded")

    def test_need_reinstall_degraded(self) -> None:
        status, detail = _health_status(
            self.state, self.cfg, _reading(setup_state="need_reinstall", tub_avg_f=None)
        )
        self.assertEqual(status, "degraded")
        self.assertEqual(detail, "need_reinstall")

    def test_no_tub_avg_degraded(self) -> None:
        status, detail = _health_status(self.state, self.cfg, _reading(tub_avg_f=None))
        self.assertEqual(status, "degraded")
        self.assertEqual(detail, "no tub temperature")

    def test_stale_degraded(self) -> None:
        status, detail = _health_status(
            self.state,
            self.cfg,
            _reading(ts="2020-01-01T00:00:00Z"),
        )
        self.assertEqual(status, "degraded")
        self.assertEqual(detail, "stale or missing temps")

    def test_missing_reading_degraded(self) -> None:
        status, detail = _health_status(self.state, self.cfg, None)
        self.assertEqual(status, "degraded")
        self.assertEqual(detail, "stale or missing temps")
