from fastapi.testclient import TestClient

from jarvis_gateway.main import create_app


def test_demo_info_defaults_to_mock_profile(monkeypatch) -> None:
    monkeypatch.setenv("FINANCE_ADAPTER_MODE", "mock")
    monkeypatch.setenv("HEALTH_ADAPTER_MODE", "mock")
    monkeypatch.setenv("AUTOSHORTS_ADAPTER_MODE", "mock")
    monkeypatch.delenv("FINANCE_LEGACY_DASHBOARD_URL", raising=False)
    monkeypatch.delenv("HEALTH_LEGACY_DASHBOARD_URL", raising=False)
    monkeypatch.delenv("AUTOSHORTS_LEGACY_DASHBOARD_URL", raising=False)
    client = TestClient(create_app())

    payload = client.get("/api/demo-info").json()

    assert payload == {
        "mode": "demo_mock",
        "actions_enabled": False,
        "modules": ["finance", "health", "autoshorts", "family", "system"],
        "runtime_access": "disabled",
        "legacy_links": {"finance": "not_configured", "health": "locked_by_policy", "autoshorts": "not_configured", "family": "not_configured"},
    }


def test_demo_info_mixed_readonly_without_paths_or_urls(monkeypatch) -> None:
    monkeypatch.setenv("FINANCE_ADAPTER_MODE", "mock")
    monkeypatch.setenv("HEALTH_ADAPTER_MODE", "safe_marker")
    monkeypatch.setenv("HEALTH_SAFE_STATUS_MARKER_PATH", "")
    monkeypatch.setenv("AUTOSHORTS_ADAPTER_MODE", "mock")
    monkeypatch.setenv("FINANCE_LEGACY_DASHBOARD_URL", "http://127.0.0.1:9999")
    client = TestClient(create_app())

    payload = client.get("/api/demo-info").json()
    rendered = str(payload)

    assert payload["mode"] == "demo_mixed_readonly"
    assert payload["actions_enabled"] is False
    assert payload["runtime_access"] == "optional_readonly"
    assert payload["legacy_links"]["finance"] == "configured"
    assert "http" not in rendered
    assert "127.0.0.1" not in rendered
    assert "9999" not in rendered
    assert "token" not in rendered.lower()


def test_demo_info_blocks_tailnet_without_exposing_url(monkeypatch) -> None:
    monkeypatch.setenv("FINANCE_LEGACY_DASHBOARD_URL", "http://100.64.0.1:5175")
    monkeypatch.setenv("JARVIS_ALLOW_TAILNET_LINKS", "0")
    client = TestClient(create_app())
    payload = client.get("/api/demo-info").json()
    assert payload["legacy_links"]["finance"] == "blocked"
    assert "100.64.0.1" not in str(payload)


def test_demo_info_handoff_profile_reports_configured_links_without_urls(monkeypatch) -> None:
    monkeypatch.setenv("JARVIS_OPERATOR_DEMO_PROFILE", "mixed_readonly_handoff")
    monkeypatch.setenv("JARVIS_ALLOW_TAILNET_LINKS", "1")
    monkeypatch.setenv("FINANCE_LEGACY_DASHBOARD_URL", "http://100.64.0.1:5173")
    monkeypatch.setenv("AUTOSHORTS_LEGACY_DASHBOARD_URL", "http://100.64.0.1:5177")
    monkeypatch.delenv("HEALTH_LEGACY_DASHBOARD_URL", raising=False)
    client = TestClient(create_app())
    payload = client.get("/api/demo-info").json()
    rendered = str(payload)
    assert payload["mode"] == "mixed_readonly_handoff"
    assert payload["actions_enabled"] is False
    assert payload["runtime_access"] == "optional_readonly"
    assert payload["legacy_links"] == {"finance": "configured", "health": "locked_by_policy", "autoshorts": "configured", "family": "not_configured"}
    assert "100.64.0.1" not in rendered
    assert "5173" not in rendered
    assert "5177" not in rendered


def test_demo_info_reports_health_configured_protected_without_url(monkeypatch) -> None:
    monkeypatch.setenv("JARVIS_ALLOW_TAILNET_LINKS", "1")
    monkeypatch.setenv("HEALTH_LEGACY_DASHBOARD_URL", "http://100.64.0.2:8014/health-dashboard")
    client = TestClient(create_app())
    payload = client.get("/api/demo-info").json()
    rendered = str(payload)
    assert payload["legacy_links"]["health"] == "configured_protected"
    assert "100.64.0.2" not in rendered
    assert "8014" not in rendered
