from collections import OrderedDict

from django.urls import reverse

from funkwhale_api import __version__ as api_version
from funkwhale_api.music.utils import SUPPORTED_EXTENSIONS


def test_nodeinfo_20(api_client):
    url = reverse("api:v1:instance:nodeinfo-2.0")
    response = api_client.get(url)

    expected = {
        "version": "2.0",
        "software": OrderedDict([("name", "funkwhale"), ("version", api_version)]),
        "protocols": ["activitypub"],
        "services": OrderedDict([("inbound", ["atom1.0"]), ("outbound", ["atom1.0"])]),
        "openRegistrations": False,
        "usage": {
            "users": OrderedDict(
                [("total", 0), ("activeHalfyear", 0), ("activeMonth", 0)]
            )
        },
        "metadata": {
            "actorId": "https://test.federation/federation/actors/service",
            "private": False,
            "shortDescription": "",
            "longDescription": "",
            "rules": "",
            "contactEmail": "",
            "terms": "",
            "nodeName": "",
            "banner": None,
            "defaultUploadQuota": 1000,
            "library": {
                "federationEnabled": True,
                "anonymousCanListen": False,
                "tracks": OrderedDict([("total", 0)]),
                "artists": OrderedDict([("total", 0)]),
                "albums": OrderedDict([("total", 0)]),
                "music": OrderedDict([("hours", 0)]),
            },
            "supportedUploadExtensions": SUPPORTED_EXTENSIONS,
            "allowList": {"enabled": False, "domains": None},
            "reportTypes": [
                OrderedDict(
                    [
                        ("type", "takedown_request"),
                        ("label", "Takedown request"),
                        ("anonymous", True),
                    ]
                ),
                OrderedDict(
                    [
                        ("type", "invalid_metadata"),
                        ("label", "Invalid metadata"),
                        ("anonymous", False),
                    ]
                ),
                OrderedDict(
                    [
                        ("type", "illegal_content"),
                        ("label", "Illegal content"),
                        ("anonymous", True),
                    ]
                ),
                OrderedDict(
                    [
                        ("type", "offensive_content"),
                        ("label", "Offensive content"),
                        ("anonymous", False),
                    ]
                ),
                OrderedDict(
                    [("type", "other"), ("label", "Other"), ("anonymous", False)]
                ),
            ],
            "funkwhaleSupportMessageEnabled": True,
            "instanceSupportMessage": "",
            "endpoints": OrderedDict(
                [("knownNodes", None), ("channels", None), ("libraries", None)]
            ),
            "usage": {
                "favorites": OrderedDict([("tracks", {"total": 0})]),
                "listenings": OrderedDict([("total", 0)]),
                "downloads": OrderedDict([("total", 0)]),
            },
        },
    }

    assert response.data == expected


def test_nodeinfo_21(api_client):
    url = reverse("api:v2:instance:nodeinfo-2.1")
    response = api_client.get(url)

    expected = {
        "version": "2.1",
        "software": OrderedDict(
            [
                ("name", "funkwhale"),
                ("version", api_version),
                ("repository", "https://dev.funkwhale.audio/funkwhale/funkwhale"),
                ("homepage", "https://funkwhale.audio"),
            ]
        ),
        "protocols": ["activitypub"],
        "services": OrderedDict([("inbound", ["atom1.0"]), ("outbound", ["atom1.0"])]),
        "openRegistrations": False,
        "usage": {
            "users": OrderedDict(
                [("total", 0), ("activeHalfyear", 0), ("activeMonth", 0)]
            ),
            "localPosts": 0,
            "localComments": 0,
        },
        "metadata": {
            "actorId": "https://test.federation/federation/actors/service",
            "private": False,
            "shortDescription": "",
            "longDescription": "",
            "contactEmail": "",
            "nodeName": "",
            "banner": None,
            "defaultUploadQuota": 1000,
            "supportedUploadExtensions": SUPPORTED_EXTENSIONS,
            "allowList": {"enabled": False, "domains": None},
            "funkwhaleSupportMessageEnabled": True,
            "instanceSupportMessage": "",
            "usage": OrderedDict(
                [
                    ("favorites", OrderedDict([("tracks", {"total": 0})])),
                    ("listenings", OrderedDict([("total", 0)])),
                    ("downloads", OrderedDict([("total", 0)])),
                ]
            ),
            "location": "",
            "languages": ["en"],
            "features": ["channels", "podcasts", "federation"],
            "content": OrderedDict(
                [
                    (
                        "local",
                        OrderedDict(
                            [
                                ("artists", 0),
                                ("releases", 0),
                                ("recordings", 0),
                                ("hoursOfContent", 0),
                            ]
                        ),
                    ),
                    ("topMusicCategories", []),
                    ("topPodcastCategories", []),
                ]
            ),
            "codeOfConduct": "",
        },
    }

    assert response.data == expected
