"""Tests for site group config endpoints."""

import uuid

import pytest

from tests.conftest import requires_db


class TestSiteGroupConfigRoutes:
    """Unit tests — no database required."""

    def test_group_config_get_route_registered(self, app):
        routes = [r.path for r in app.routes]
        assert "/api/v1/site-groups/{group_id}/config" in routes

    def test_group_config_put_route_registered(self, app):
        routes = [r.path for r in app.routes]
        assert "/api/v1/site-groups/{group_id}/config" in routes

    @pytest.mark.asyncio
    async def test_get_group_config_requires_auth(self, client):
        group_id = uuid.uuid4()
        resp = await client.get(f"/api/v1/site-groups/{group_id}/config")
        assert resp.status_code == 401

    @pytest.mark.asyncio
    async def test_put_group_config_requires_auth(self, client):
        group_id = uuid.uuid4()
        resp = await client.put(
            f"/api/v1/site-groups/{group_id}/config",
            json={"blocking_mode": "opt_in"},
        )
        assert resp.status_code == 401


class TestSiteGroupConfigIntegration:
    """Integration tests — require a running PostgreSQL database."""

    @requires_db
    async def test_create_group_and_get_config(self, db_client, auth_headers):
        # Create a group
        resp = await db_client.post(
            "/api/v1/site-groups/",
            json={"name": f"test-group-{uuid.uuid4().hex[:8]}"},
            headers=auth_headers,
        )
        assert resp.status_code == 201
        group_id = resp.json()["id"]

        # GET config (auto-creates empty row)
        resp = await db_client.get(
            f"/api/v1/site-groups/{group_id}/config",
            headers=auth_headers,
        )
        assert resp.status_code == 200
        data = resp.json()
        assert data["site_group_id"] == group_id
        assert data["blocking_mode"] is None
        assert data["consent_expiry_days"] is None

    @requires_db
    async def test_update_group_config(self, db_client, auth_headers):
        # Create a group
        resp = await db_client.post(
            "/api/v1/site-groups/",
            json={"name": f"cfg-group-{uuid.uuid4().hex[:8]}"},
            headers=auth_headers,
        )
        group_id = resp.json()["id"]

        # PUT config
        resp = await db_client.put(
            f"/api/v1/site-groups/{group_id}/config",
            json={
                "blocking_mode": "opt_out",
                "consent_expiry_days": 90,
                "tcf_enabled": True,
            },
            headers=auth_headers,
        )
        assert resp.status_code == 200
        data = resp.json()
        assert data["blocking_mode"] == "opt_out"
        assert data["consent_expiry_days"] == 90
        assert data["tcf_enabled"] is True

        # GET confirms persistence
        resp = await db_client.get(
            f"/api/v1/site-groups/{group_id}/config",
            headers=auth_headers,
        )
        data = resp.json()
        assert data["blocking_mode"] == "opt_out"
        assert data["consent_expiry_days"] == 90

    @requires_db
    async def test_group_config_not_found_for_other_org(self, db_client, auth_headers):
        fake_group_id = str(uuid.uuid4())
        resp = await db_client.get(
            f"/api/v1/site-groups/{fake_group_id}/config",
            headers=auth_headers,
        )
        assert resp.status_code == 404
