from typing import Optional

from httpx import AsyncClient

from ..model import CurrentlyPlaying, FullTrack
from ..utils.events import Event

URL_CURRENTLY_PLAYING = "https://api.spotify.com/v1/me/player/currently-playing"


async def get_current_song(
    client: AsyncClient, current_song: Optional[CurrentlyPlaying] = None
) -> Optional[CurrentlyPlaying]:
    """
        Method to get currently plaing song.
        Requires access token to be set in `client` Authorization header.
        Requires user-read-currently-playing scope.

        Documentation: https://developer.spotify.com/documentation/web-api/reference/player/get-the-users-currently-playing-track/

        Responses from Spotify Web API:
        - (Success) 204 NO CONTENT with no payload
        - (Success) 200 OK with JSON like below:
            {
                "context": {
                    "external_urls" : {
                        "spotify" : "http://open.spotify.com/user/spotify/playlist/49znshcYJROspEqBoHg3Sv"
                    },
                    "href" : "https://api.spotify.com/v1/users/spotify/playlists/49znshcYJROspEqBoHg3Sv",
                    "type" : "playlist",
                    "uri" : "spotify:user:spotify:playlist:49znshcYJROspEqBoHg3Sv"
                },
                "timestamp": 1490252122574,
                "progress_ms": 44272,
                "is_playing": true,
                "currently_playing_type": "track",
                "actions": {
                    "disallows": {
                        "resuming": true
                    }
                },
                "item": {
                    "album": {
                    "album_type": "album",
                    "external_urls": {
                        "spotify": "https://open.spotify.com/album/6TJmQnO44YE5BtTxH8pop1"
                    },
                    "href": "https://api.spotify.com/v1/albums/6TJmQnO44YE5BtTxH8pop1",
                    "id": "6TJmQnO44YE5BtTxH8pop1",
                    "images": [
                        {
                            "height": 640,
                            "url": "https://i.scdn.co/image/8e13218039f81b000553e25522a7f0d7a0600f2e",
                            "width": 629
                        },
                        {
                            "height": 300,
                            "url": "https://i.scdn.co/image/8c1e066b5d1045038437d92815d49987f519e44f",
                            "width": 295
                        },
                        {
                            "height": 64,
                            "url": "https://i.scdn.co/image/d49268a8fc0768084f4750cf1647709e89a27172",
                            "width": 63
                        }
                    ],
                    "name": "Hot Fuss",
                    "type": "album",
                    "uri": "spotify:album:6TJmQnO44YE5BtTxH8pop1"
                    },
                    "artists": [
                        {
                            "external_urls": {
                                "spotify": "https://open.spotify.com/artist/0C0XlULifJtAgn6ZNCW2eu"
                            },
                            "href": "https://api.spotify.com/v1/artists/0C0XlULifJtAgn6ZNCW2eu",
                            "id": "0C0XlULifJtAgn6ZNCW2eu",
                            "name": "The Killers",
                            "type": "artist",
                            "uri": "spotify:artist:0C0XlULifJtAgn6ZNCW2eu"
                        }
                    ],
                    "available_markets": [
                        "AD",
                        "AR",
                        "TW",
                        "UY"
                    ],
                    "disc_number": 1,
                    "duration_ms": 222075,
                    "explicit": false,
                    "external_ids": {
                        "isrc": "USIR20400274"
                    },
                    "external_urls": {
                        "spotify": "https://open.spotify.com/track/0eGsygTp906u18L0Oimnem"
                    },
                    "href": "https://api.spotify.com/v1/tracks/0eGsygTp906u18L0Oimnem",
                    "id": "0eGsygTp906u18L0Oimnem",
                    "name": "Mr. Brightside",
                    "popularity": 0,
                    "preview_url": "http://d318706lgtcm8e.cloudfront.net/mp3-preview/f454c8224828e21fa146af84916fd22cb89cedc6",
                    "track_number": 2,
                    "type": "track",
                    "uri": "spotify:track:0eGsygTp906u18L0Oimnem"
                }
            }
        - (Fail) Everything else
    """
    async with client:
        response = await client.get(URL_CURRENTLY_PLAYING)

    if response.status_code == 204 or response.status_code != 200:
        return None

    return CurrentlyPlaying.from_json(response.text, current_song)
