import json
import base64
import requests
from urllib.parse import urlencode
from http.server import BaseHTTPRequestHandler, HTTPServer

# Step 1: Load secrets
with open("secrets.json") as f:
    secrets = json.load(f)

client_id = secrets["client_id"]
client_secret = secrets["client_secret"]
redirect_uri = secrets["redirect_uri"]

# Step 2: User authorization URL
scopes = "playlist-modify-private user-read-private"
params = {
    "client_id": client_id,
    "response_type": "code",
    "redirect_uri": redirect_uri,
    "scope": scopes,
}
print("Open this URL in your browser:\n")
print("https://accounts.spotify.com/authorize?" + urlencode(params))
print("\nWaiting for redirect...")

# Step 3: Start a local server to capture the code
class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        from urllib.parse import urlparse, parse_qs
        query = parse_qs(urlparse(self.path).query)
        code = query.get("code", [None])[0]
        if not code:
            self.send_response(400)
            self.end_headers()
            self.wfile.write(b"No code provided.")
            return

        # Exchange code for tokens
        auth_str = f"{client_id}:{client_secret}"
        b64_auth = base64.b64encode(auth_str.encode()).decode()
        response = requests.post(
            "https://accounts.spotify.com/api/token",
            headers={"Authorization": f"Basic {b64_auth}"},
            data={
                "grant_type": "authorization_code",
                "code": code,
                "redirect_uri": redirect_uri,
            },
        )

        token_info = response.json()
        print("\nAccess Token:", token_info["access_token"])
        print("Refresh Token:", token_info.get("refresh_token"))
        print("Expires in:", token_info["expires_in"], "seconds")

        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Spotify authorization successful! You can close this tab.")
        exit(0)

# Step 4: Wait for redirect
HTTPServer(("127.0.0.1", 8888), Handler).serve_forever()
