import json

from fastapi.testclient import TestClient
from pytest import fixture

from tests.utils import api_routes


@fixture
def long_live_token(api_client: TestClient, admin_token):
    response = api_client.post(api_routes.users_api_tokens, json={"name": "Test Fixture Token"}, headers=admin_token)
    assert response.status_code == 201

    return {"Authorization": f"Bearer {json.loads(response.text).get('token')}"}


def test_api_token_creation(api_client: TestClient, admin_token):
    response = api_client.post(api_routes.users_api_tokens, json={"name": "Test API Token"}, headers=admin_token)
    assert response.status_code == 201
    assert response.json()["token"]


def test_api_token_private(api_client: TestClient, admin_token):
    response = api_client.post(api_routes.users_api_tokens, json={"name": "Test API Token"}, headers=admin_token)
    assert response.status_code == 201

    response = api_client.get(api_routes.admin_users, headers=admin_token, params={"perPage": -1})
    assert response.status_code == 200
    for user in response.json()["items"]:
        for user_token in user["tokens"] or []:
            assert "token" not in user_token

    response = api_client.get(api_routes.users_self, headers=admin_token)
    assert response.status_code == 200
    response_json = response.json()
    assert response_json["tokens"]
    for user_token in response_json["tokens"]:
        assert "token" not in user_token


def test_use_token(api_client: TestClient, long_live_token):
    response = api_client.get(api_routes.admin_users, headers=long_live_token)

    assert response.status_code == 200


def test_delete_token(api_client: TestClient, admin_token):
    response = api_client.delete(api_routes.users_api_tokens_token_id(1), headers=admin_token)
    assert response.status_code == 200

    response = api_client.delete(api_routes.users_api_tokens_token_id(2), headers=admin_token)
    assert response.status_code == 200
