from funkwhale_api.music import serializers


def test_artist_album_serializer(factories, to_api_date):
    track = factories['music.Track']()
    album = track.album
    album = album.__class__.objects.with_tracks_count().get(pk=album.pk)
    expected = {
        'id': album.id,
        'mbid': str(album.mbid),
        'title': album.title,
        'artist': album.artist.id,
        'creation_date': to_api_date(album.creation_date),
        'tracks_count': 1,
        'cover': album.cover.url,
        'release_date': to_api_date(album.release_date),
    }
    serializer = serializers.ArtistAlbumSerializer(album)

    assert serializer.data == expected


def test_artist_with_albums_serializer(factories, to_api_date):
    track = factories['music.Track']()
    artist = track.artist
    artist = artist.__class__.objects.with_albums().get(pk=artist.pk)
    album = list(artist.albums.all())[0]

    expected = {
        'id': artist.id,
        'mbid': str(artist.mbid),
        'name': artist.name,
        'creation_date': to_api_date(artist.creation_date),
        'albums': [
            serializers.ArtistAlbumSerializer(album).data
        ]
    }
    serializer = serializers.ArtistWithAlbumsSerializer(artist)
    assert serializer.data == expected


def test_album_track_serializer(factories, to_api_date):
    tf = factories['music.TrackFile']()
    track = tf.track

    expected = {
        'id': track.id,
        'artist': track.artist.id,
        'album': track.album.id,
        'mbid': str(track.mbid),
        'title': track.title,
        'position': track.position,
        'creation_date': to_api_date(track.creation_date),
        'files': [
            serializers.TrackFileSerializer(tf).data
        ]
    }
    serializer = serializers.AlbumTrackSerializer(track)
    assert serializer.data == expected


def test_track_file_serializer(factories, to_api_date):
    tf = factories['music.TrackFile']()

    expected = {
        'id': tf.id,
        'path': tf.path,
        'source': tf.source,
        'filename': tf.filename,
        'mimetype': tf.mimetype,
        'track': tf.track.pk,
        'duration': tf.duration,
        'mimetype': tf.mimetype,
        'bitrate': tf.bitrate,
        'size': tf.size,
    }
    serializer = serializers.TrackFileSerializer(tf)
    assert serializer.data == expected


def test_album_serializer(factories, to_api_date):
    track1 = factories['music.Track'](position=2)
    track2 = factories['music.Track'](position=1, album=track1.album)
    album = track1.album
    expected = {
        'id': album.id,
        'mbid': str(album.mbid),
        'title': album.title,
        'artist': serializers.ArtistSimpleSerializer(album.artist).data,
        'creation_date': to_api_date(album.creation_date),
        'cover': album.cover.url,
        'release_date': to_api_date(album.release_date),
        'tracks': serializers.AlbumTrackSerializer(
            [track2, track1],
            many=True
        ).data
    }
    serializer = serializers.AlbumSerializer(album)

    assert serializer.data == expected


def test_track_serializer(factories, to_api_date):
    tf = factories['music.TrackFile']()
    track = tf.track

    expected = {
        'id': track.id,
        'artist': serializers.ArtistSimpleSerializer(track.artist).data,
        'album': serializers.TrackAlbumSerializer(track.album).data,
        'mbid': str(track.mbid),
        'title': track.title,
        'position': track.position,
        'creation_date': to_api_date(track.creation_date),
        'lyrics': track.get_lyrics_url(),
        'files': [
            serializers.TrackFileSerializer(tf).data
        ]
    }
    serializer = serializers.TrackSerializer(track)
    assert serializer.data == expected