"""
test_offline_engine.py — Phase 1 Offline Engine smoke tests (v12.36).

Validates:
  1. `/api/feature-flags/resolved` exists and returns a name → bool map
  2. `service-worker` and `mutation-queue` flags are registered by seed
  3. Default = OFF for both (safe rollout posture)
  4. Super-admin can flip the `service-worker` flag global ON and OFF
  5. Per-user toggle promotes only that user to ON
  6. Kill switch wins over every other rule
  7. Read access (`/resolved`, `/`) is open to any authed user, write is admin-only

These tests are non-destructive: they reset every flag they touch back
to its baseline so subsequent runs (and the other suites in this dir)
see a clean engine.
"""
from __future__ import annotations
import pytest
import requests

from conftest import BASE_URL  # type: ignore[import-not-found]


FLAGS_OF_INTEREST = ("service-worker", "mutation-queue")


def _get_flag(admin, name):
    r = admin.get(f"{BASE_URL}/api/feature-flags", timeout=15)
    assert r.status_code == 200, r.text
    for f in r.json().get("flags", []):
        if f["name"] == name:
            return f
    return None


def _set_global(admin, name, value):
    r = admin.put(f"{BASE_URL}/api/feature-flags/{name}", json={"enabled_global": value}, timeout=15)
    assert r.status_code == 200, r.text


def _set_kill(admin, name, on):
    r = admin.post(f"{BASE_URL}/api/feature-flags/{name}/kill", params={"on": on}, timeout=15)
    assert r.status_code == 200, r.text


def _toggle_user(admin, name, user_id, enable):
    r = admin.post(
        f"{BASE_URL}/api/feature-flags/{name}/toggle-user",
        json={"user_id": user_id, "enable": enable},
        timeout=15,
    )
    assert r.status_code == 200, r.text


@pytest.mark.critical
class TestOfflineEngineFlags:
    def test_resolved_endpoint_returns_map(self, admin_session):
        r = admin_session.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
        assert r.status_code == 200, r.text
        data = r.json()
        assert isinstance(data, dict)
        for flag in FLAGS_OF_INTEREST:
            assert flag in data, f"{flag} missing from resolved map"
            assert isinstance(data[flag], bool)

    def test_offline_flags_default_off(self, admin_session):
        for flag in FLAGS_OF_INTEREST:
            doc = _get_flag(admin_session, flag)
            assert doc is not None, f"{flag} not seeded"
            assert doc["enabled_global"] is False, f"{flag} must default OFF"
            assert doc.get("kill_switch") is False, f"{flag} kill switch should start OFF"

    def test_super_admin_can_flip_global_on_off(self, admin_session):
        flag = "service-worker"
        try:
            _set_global(admin_session, flag, True)
            r = admin_session.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
            assert r.json().get(flag) is True
        finally:
            _set_global(admin_session, flag, False)
            r = admin_session.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
            assert r.json().get(flag) is False

    def test_kill_switch_overrides_everything(self, admin_session):
        flag = "service-worker"
        try:
            _set_global(admin_session, flag, True)
            r = admin_session.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
            assert r.json().get(flag) is True
            _set_kill(admin_session, flag, True)
            r = admin_session.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
            assert r.json().get(flag) is False, "Kill switch must force OFF"
        finally:
            _set_kill(admin_session, flag, False)
            _set_global(admin_session, flag, False)

    def test_per_user_toggle_promotes_only_that_user(self, admin_session):
        # Resolve the current admin's id so we can promote them surgically.
        me = admin_session.get(f"{BASE_URL}/api/auth/me", timeout=15).json()
        uid = me.get("id") or me.get("_id") or me.get("user_id")
        assert uid, f"Could not derive admin id from /auth/me: {me}"
        flag = "mutation-queue"
        try:
            _toggle_user(admin_session, flag, uid, True)
            r = admin_session.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
            assert r.json().get(flag) is True, "User-level enable must light up"
        finally:
            _toggle_user(admin_session, flag, uid, False)
            r = admin_session.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
            assert r.json().get(flag) is False

    def test_anonymous_cannot_read_flags(self):
        r = requests.get(f"{BASE_URL}/api/feature-flags/resolved", timeout=15)
        assert r.status_code in (401, 403), r.text

    def test_anonymous_cannot_mutate_flags(self):
        r = requests.put(
            f"{BASE_URL}/api/feature-flags/service-worker",
            json={"enabled_global": True},
            timeout=15,
        )
        assert r.status_code in (401, 403, 422), r.text
