import { type Coordinates } from "./gps"
import { parseSong, parseSuggestion, type FetchError, type Song, type Suggestion } from "./types"

export const joinRoom = async function (roomId: string, coords: Coordinates, pin: string): Promise<[FetchError | null, string]> {
    let res = await fetch(`/api/join?room=${roomId}&lat=${coords.latitude}&lon=${coords.longitude}&pin=${pin}`)

    if (res.status != 200) {
        return [{ code: 400, message: "Cannot join the room" }, ""]
    }

    return [null, "test"]
}

export const getSuggestions = async function (roomId: string): Promise<[FetchError | null, Suggestion[]]> {
    let resp = await fetch("/api/room/suggestions?room=" + roomId)

    if (resp.status != 200) {
        return [{ code: 400, message: "Failed to retrieve suggestions" }, []]
    }

    let json = await resp.json()
    let suggestions: Suggestion[] = []

    json["songs"].forEach(async (i: any) => {
        suggestions.push(await parseSuggestion(i))
    })

    suggestions = suggestions.sort((a, b) => {
        return a.upvote - b.upvote
    })

    return [null, suggestions]
}

export const getQueueSongs = async function (roomId: string): Promise<[FetchError | null, Song[], number]> {
    let resp = await fetch("/api/queue?room=" + roomId)
    if (resp.status != 200) {
        return [{ code: 400, message: "Failed to load queue songs" }, [], 0]
    }

    let json = await resp.json()
    let songs: Song[] = []

    json["queue"].forEach(async (i: any) => {
        songs.push(await parseSong(i))
    })

    let playingId = json["index"]

    return [null, songs, playingId]
}

export const triggerPlayNext = async function (roomId: string): Promise<[FetchError | null, Song[], number]> {
    let resp = await fetch("/api/queue/next?room=" + roomId, { method: "POST" })

    if (resp.status != 200) {
        return [{ code: 400, message: "Failed to trigger next song playback" }, [], 0]
    }

    let json = await resp.json()

    let songs: Song[] = []

    json["queue"].forEach(async (i: any) => {
        songs.push(await parseSong(i))
    })
    return [null, songs, json["index"]]
}

export const getStreamingUrl = async function (uuid: string) {
    let resp = await fetch("/api/song/audio?song=" + uuid)

    let json = await resp.json()

    return json["url"]
}
