"""Тесты публичного эндпоинта настроек клиента (`/api/v1/public/settings`, сессия 33)."""

import httpx
import pytest_asyncio
from sqlalchemy.ext.asyncio import AsyncSession

from services.instance_settings import InstanceSettingsService, SettingsUpdateIn


@pytest_asyncio.fixture(autouse=True)
async def _reset_public_flags(db_session: AsyncSession) -> None:
    """Сбросить публичные тогглы перед каждым тестом — общая dev-БД не изолирована
    от ручных правок администратора (та же дисциплина, что и `_reset_registration_gating`
    в `test_auth.py`); `db_session` не коммитится в реальную БД, см. `conftest.py`."""
    await InstanceSettingsService(db_session).update(
        SettingsUpdateIn(device_check_enabled=False, virtual_background_enabled=False)
    )


async def test_public_settings_disabled_by_default(
    client: httpx.AsyncClient, db_session: AsyncSession
) -> None:
    response = await client.get("/api/v1/public/settings")
    assert response.status_code == 200, response.text
    assert response.json() == {"device_check_enabled": False, "virtual_background_enabled": False}


async def test_public_settings_reflects_enabled(
    client: httpx.AsyncClient, db_session: AsyncSession
) -> None:
    await InstanceSettingsService(db_session).update(SettingsUpdateIn(device_check_enabled=True))
    await db_session.commit()

    response = await client.get("/api/v1/public/settings")
    assert response.status_code == 200, response.text
    assert response.json()["device_check_enabled"] is True


async def test_public_settings_reflects_virtual_background_enabled(
    client: httpx.AsyncClient, db_session: AsyncSession
) -> None:
    """Замена фона нужна и на публичном превью входа (`JoinPage`) — до аутентификации."""
    await InstanceSettingsService(db_session).update(
        SettingsUpdateIn(virtual_background_enabled=True)
    )
    await db_session.commit()

    response = await client.get("/api/v1/public/settings")
    assert response.status_code == 200, response.text
    assert response.json()["virtual_background_enabled"] is True


async def test_public_settings_requires_no_auth(
    client: httpx.AsyncClient, db_session: AsyncSession
) -> None:
    """Эндпоинт публичный — работает без заголовка `Authorization`, как и обязан
    (обе страницы, которым он нужен, доступны до входа в систему)."""
    response = await client.get("/api/v1/public/settings")
    assert response.status_code == 200, response.text
