"""Tests for settings_service runtime settings helpers."""

from __future__ import annotations

from pathlib import Path

import aiosqlite
import pytest

from app.db import init_db
from app.services import settings_service


@pytest.fixture
async def db(tmp_path: Path) -> aiosqlite.Connection:  # type: ignore[misc]
    """Provide an initialised aiosqlite connection for settings service tests."""
    conn: aiosqlite.Connection = await aiosqlite.connect(str(tmp_path / "test.db"))
    conn.row_factory = aiosqlite.Row
    await init_db(conn)
    yield conn
    await conn.close()


class TestMapColorThresholds:
    async def test_get_map_color_thresholds_returns_defaults_on_fresh_db(
        self, db: aiosqlite.Connection
    ) -> None:
        """get_map_color_thresholds() returns default values on a fresh database."""
        high, medium, low = await settings_service.get_map_color_thresholds(db)

        assert high == 100
        assert medium == 50
        assert low == 20

    async def test_set_map_color_thresholds_persists_values(
        self, db: aiosqlite.Connection
    ) -> None:
        """set_map_color_thresholds() stores and retrieves custom values."""
        await settings_service.set_map_color_thresholds(
            db, threshold_high=200, threshold_medium=80, threshold_low=30
        )

        high, medium, low = await settings_service.get_map_color_thresholds(db)
        assert high == 200
        assert medium == 80
        assert low == 30

    async def test_set_map_color_thresholds_rejects_non_positive(
        self, db: aiosqlite.Connection
    ) -> None:
        """set_map_color_thresholds() raises ValueError for non-positive thresholds."""
        with pytest.raises(ValueError, match="positive integers"):
            await settings_service.set_map_color_thresholds(
                db, threshold_high=100, threshold_medium=50, threshold_low=0
            )
        with pytest.raises(ValueError, match="positive integers"):
            await settings_service.set_map_color_thresholds(
                db, threshold_high=-10, threshold_medium=50, threshold_low=20
            )

    async def test_set_map_color_thresholds_rejects_invalid_order(
        self, db: aiosqlite.Connection
    ) -> None:
        """set_map_color_thresholds() rejects invalid ordering."""
        with pytest.raises(ValueError, match="high > medium > low"):
            await settings_service.set_map_color_thresholds(
                db, threshold_high=50, threshold_medium=50, threshold_low=20
            )
        with pytest.raises(ValueError, match="high > medium > low"):
            await settings_service.set_map_color_thresholds(
                db, threshold_high=100, threshold_medium=30, threshold_low=50
            )
