import os
import sys

PLUGIN_ROOT = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0, PLUGIN_ROOT)
sys.path.insert(0, os.environ.get("HERMES_ROOT", "/opt/hermes"))
sys.path.insert(0, "/root/.hermes/plugins/platforms/chatto")

from platform_config import (
    _get_env_or_extra_int,
    _get_env_or_extra_list,
    _get_env_or_extra_str,
    _get_env_or_extra_str_opt,
    _get_env_or_extra_truthy,
    _split_str_to_list,
)


class TestPlatformConfigHelpers:
    """Test Chatto configuration helper functions."""

    def test_get_env_or_extra_str_prefers_env(self, monkeypatch):
        monkeypatch.setenv("CHATTO_TEST", " env-value ")
        assert _get_env_or_extra_str("CHATTO_TEST", "extra-value") == "env-value"

    def test_get_env_or_extra_str_uses_extra_when_no_env(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_str("CHATTO_TEST", " extra-value ") == "extra-value"

    def test_get_env_or_extra_str_returns_empty_when_missing(self, monkeypatch):
        """The non-optional helper coerces a missing value to "" — use
        _get_env_or_extra_str_opt() when None has to stay distinguishable."""
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_str("CHATTO_TEST", None) == ""

    def test_get_env_or_extra_str_opt_returns_none_when_missing(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_str_opt("CHATTO_TEST", None) is None

    def test_get_env_or_extra_str_opt_prefers_env(self, monkeypatch):
        monkeypatch.setenv("CHATTO_TEST", " env-value ")
        assert _get_env_or_extra_str_opt("CHATTO_TEST", "extra-value") == "env-value"

    def test_get_env_or_extra_truthy_parses_truthy_values(self, monkeypatch):
        monkeypatch.setenv("CHATTO_TEST", " yes ")
        assert _get_env_or_extra_truthy("CHATTO_TEST", None) is True

    def test_get_env_or_extra_truthy_uses_extra_when_no_env(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_truthy("CHATTO_TEST", " true ") is True

    def test_get_env_or_extra_truthy_uses_default_false(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_truthy("CHATTO_TEST", "false") is False

    def test_get_env_or_extra_truthy_default_true_when_none_and_no_extra(
        self, monkeypatch
    ):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_truthy("CHATTO_TEST", None, default=True) is True

    def test_get_env_or_extra_truthy_default_false_when_none_and_no_extra(
        self, monkeypatch
    ):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_truthy("CHATTO_TEST", None, default=False) is False

    def test_get_env_or_extra_truthy_explicit_bool_true(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_truthy("CHATTO_TEST", True, default=False) is True

    def test_get_env_or_extra_truthy_explicit_bool_false(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_truthy("CHATTO_TEST", False, default=True) is False

    def test_split_str_to_list_handles_comma_separated_values(self):
        assert _split_str_to_list("a,b, c ,d") == ["a", "b", "c", "d"]

    def test_get_env_or_extra_list_prefers_env(self, monkeypatch):
        monkeypatch.setenv("CHATTO_TEST", " one,two , three")
        assert _get_env_or_extra_list("CHATTO_TEST", ["ignored", "list"]) == [
            "one",
            "two",
            "three",
        ]

    def test_get_env_or_extra_list_uses_extra_list(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_list("CHATTO_TEST", ["a", " b "]) == ["a", "b"]

    def test_get_env_or_extra_list_uses_extra_string(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_list("CHATTO_TEST", "x,y") == ["x", "y"]

    def test_get_env_or_extra_list_returns_empty_for_none(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_list("CHATTO_TEST", None) == []

    def test_get_env_or_extra_int_prefers_env(self, monkeypatch):
        monkeypatch.setenv("CHATTO_TEST", " 45 ")
        assert _get_env_or_extra_int("CHATTO_TEST", 300, default=300) == 45

    def test_get_env_or_extra_int_uses_extra_when_no_env(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_int("CHATTO_TEST", 60, default=300) == 60

    def test_get_env_or_extra_int_parses_extra_string(self, monkeypatch):
        """config.yaml values arrive as strings when set via env-style files."""
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_int("CHATTO_TEST", "90", default=300) == 90

    def test_get_env_or_extra_int_falls_back_to_default_for_junk(self, monkeypatch):
        monkeypatch.setenv("CHATTO_TEST", "soon-ish")
        assert _get_env_or_extra_int("CHATTO_TEST", None, default=300) == 300

    def test_get_env_or_extra_int_treats_yaml_bool_as_missing(self, monkeypatch):
        """A YAML true/false is not a number — silently take the default."""
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_int("CHATTO_TEST", True, default=300) == 300

    def test_get_env_or_extra_int_defaults_when_both_missing(self, monkeypatch):
        monkeypatch.delenv("CHATTO_TEST", raising=False)
        assert _get_env_or_extra_int("CHATTO_TEST", None, default=300) == 300
