package models

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"strings"
)

type LastFMTrack struct {
	Name   string `json:"name"`
	Artist struct {
		Name string `json:"#text"`
	} `json:"artist"`
	Album struct {
		Name string `json:"#text"`
	} `json:"album"`
	Date struct {
		Unix string `json:"#text"`
	} `json:"date"`
}

type LastFMResponse struct {
	RecentTracks struct {
		Tracks []LastFMTrack `json:"track"`
	} `json:"recenttracks"`
}

func LastFMGetRecentTracks(username, apiKey string) (*LastFMResponse, error) {
	url := fmt.Sprintf("https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=%s&api_key=%s&format=json", username, apiKey)
	resp, err := http.Get(url)
	if err != nil {
		return nil, fmt.Errorf("lastfm get resp err: %v", err)
	}
	defer resp.Body.Close()
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("lastfm read resp body err: %v", err)
	}
	var lastFMResponse LastFMResponse
	if err := json.Unmarshal(body, &lastFMResponse); err != nil {
		return nil, fmt.Errorf("lastfm unmarshal err: %v", err)
	}

	return &lastFMResponse, nil
}

func LastFMGetLastTrack(username, apiKey string) (string, error) {
	resp, err := LastFMGetRecentTracks(username, apiKey)
	if err != nil {
		return "", err
	}
	var data string
	if len(resp.RecentTracks.Tracks) > 0 {
		track := resp.RecentTracks.Tracks[0]
		data = fmt.Sprintf("%s - %s", track.Name, track.Artist.Name)
		data = strings.ReplaceAll(data, "🅴", "[E]")
	} else {
		return "", fmt.Errorf("len(resp.RecentTracks.Tracks) <= 0")
	}
	return data, nil
}
