const { SlashCommandBuilder, EmbedBuilder, DefaultWebSocketManagerOptions, discordSort } = require("discord.js");
const { __glob } = require("../modules/global-variables");
const { LogType } = require("loguix");
const subplayer = require("./sub-player")
const fs = require("fs");
const { randomUUID } = require("crypto");
const { url } = require("inspector");
var playlists = {}
const plog = new LogType("Playlist-Manager")

/// <reference path="./types.d.ts" />

check()


module.exports.getUser = function (userId) {
    check()
    var allPlaylist = new Object()
    // Inject "shared" playlist object in allPlaylist

    if(playlists[userId]) {
        // Copy the keys of the user playlist to the allPlaylist object
        for(var key in playlists[userId]) {
            allPlaylist[key] = playlists[userId][key]
        }
        // Copy the keys of the shared playlist to the allPlaylist object
        for(var key in playlists["shared"]) {
            allPlaylist[key] = playlists["shared"][key]
        }
    }   

 
    
    if(!playlists[userId]) {
        plog.log("Ajout de l'utilisateur \"" + userId  + "\" dans la base de donnée Playlist !")
        playlists[userId] = {}

        fs.writeFileSync(__glob.PLAYLIST, JSON.stringify(playlists, null, 2))
        
        return allPlaylist
    } else {

        plog.log("L'utilisateur \"" + userId  + "\" existe déjà dans la base de donnée Playlist !")
        
        return allPlaylist
    }

    

}

module.exports.addPlaylist = function (userId, data) {
    check()
    var name = data.name
    var source = data.source
    var content = []

    if(source == "shared") {
        userId = "shared"

    }

    var alreadyExist = false

    for(var pIndex in playlists[userId]) {
        if(playlists[userId][pIndex].title == name) {
            alreadyExist = true
        }
    }
    
    if(!alreadyExist) {
        plog.log("Ajout de la playlist '" + name + "' à l'utilisateur \"" + userId  + "\" dans la base de donnée Playlist !")
        var id = randomUUID().toString()

        if(source == "youtube") {
            content = data.url
        }

        playlists[userId][id] = {
            "title": name,
            "source": data.source,
            "content": content
        }

        fs.writeFileSync(__glob.PLAYLIST, JSON.stringify(playlists, null, 2))
    } else {

        plog.log("L'utilisateur \"" + userId  + "\" à déjà une playlist avec le nom " +  name + " dans la base de donnée Playlist !")
    
    }

    process.emit("PLAYLIST_REFRESH")

}

module.exports.copyPlaylist = function (userId, from, dest) {
    check()
    this.getUser(dest)

    userId = checkSharedMusic(from, userId)

    var alreadyExist = false

    for(var pIndex in playlists[dest]) {
        if(playlists[dest][pIndex].title == playlists[userId][from].title) {
            alreadyExist = true
        }
    }

    var id = randomUUID().toString()
 
    if(!alreadyExist) {
        plog.log("Ajout de la playlist à l'utilisateur \"" + userId  + "\" dans la base de donnée Playlist !")
        playlists[dest][id] = playlists[userId][from]

        fs.writeFileSync(__glob.PLAYLIST, JSON.stringify(playlists, null, 2))
    } else {

        plog.log("L'utilisateur \"" + dest  + "\" à déjà une playlist avec le nom "+ from + " dans la base de donnée Playlist !")
    
    }

    process.emit("PLAYLIST_REFRESH")


}

module.exports.removePlaylist = function (userId, id) {
    check()

    userId = checkSharedMusic(id, userId)

    if(playlists[userId][id]) {
        plog.log("Supression de la playlist à l'utilisateur \"" + userId  + "\" dans la base de donnée Playlist !")

        delete playlists[userId][id]

        fs.writeFileSync(__glob.PLAYLIST, JSON.stringify(playlists, null, 2))
    } else {

        plog.log("L'utilisateur \"" + userId  + "\" n'a pas une playlist avec l'identifiant  "+ id + " dans la base de donnée Playlist !")
    
    }

    process.emit("PLAYLIST_REFRESH")


}

module.exports.renamePlaylist = function (userId, id, newName) {
    check()

    userId = checkSharedMusic(id, userId)

    if(playlists[userId][id]) {
        plog.log("Renommage de la playlist à l'utilisateur \"" + userId  + "\" dans la base de donnée Playlist !")
        playlists[userId][id].title = newName

        fs.writeFileSync(__glob.PLAYLIST, JSON.stringify(playlists, null, 2))
    } else {

        plog.log("L'utilisateur \"" + userId  + "\" n'a pas une playlist avec l'identifiant  "+ id + " dans la base de donnée Playlist !")

    }

    process.emit("PLAYLIST_REFRESH")


}
    

module.exports.addSong = async function (userId, id, urlSong) {
    check()

    userId = checkSharedMusic(id, userId)

    if(playlists[userId][id]) {
    
        // Check if it's not a youtube playlist 

        if(playlists[userId][id].source != "youtube") {
            
            plog.log("Ajout d'une chanson dans la playlist '" + id + "' à l'utilisateur \"" + userId  + "\" dans la base de donnée Playlist !")
                
            var song = await subplayer.getSong(urlSong)
          
            playlists[userId][id].content.push(song)
            
            fs.writeFileSync(__glob.PLAYLIST, JSON.stringify(playlists, null, 2))

        } else {
                
            plog.log("La playlist '" + id + "' à l'utilisateur \"" + userId  + "\" est une playlist youtube, vous ne pouvez pas ajouter de chanson à une playlist youtube !")
        }
    } else {

        plog.log("L'utilisateur \"" + userId  + "\" n'a pas une playlist avec le nom "+ id + " dans la base de donnée Playlist !")
    
    }

    process.emit("PLAYLIST_REFRESH")


}


module.exports.removeSong = function (userId, id, identifier ) {
    check()

    userId = checkSharedMusic(id, userId)

    if(playlists[userId][id]) {
        plog.log("Supression d'une chanson dans la playlist '" + id + "' à l'utilisateur \"" + userId  + "\" dans la base de donnée Playlist !")
        
        // Check with the identifier the song to remove
        
        for(var song of playlists[userId][id].content) {
            if(song.identifier == identifier) {
                playlists[userId][id].content.splice(playlists[userId][id].content.indexOf(song), 1)
            }
        }

        fs.writeFileSync(__glob.PLAYLIST, JSON.stringify(playlists, null, 2))
    } else {

        plog.log("L'utilisateur \"" + userId  + "\" n'a pas une playlist avec le nom "+ id + " dans la base de donnée Playlist !")
    
    }

    process.emit("PLAYLIST_REFRESH")


}

module.exports.playPlaylist = function (userId, id, quick) {
    check()

    userId = checkSharedMusic(id, userId)

    if(playlists[userId][id]) {
        plog.log("Ajout de la playlist à l'utilisateur \"" + userId  + "\" dans la liste de lecture !")
        
        subplayer.playPlaylist(id, playlists[userId][id].content, quick)
    } else {

        plog.log("L'utilisateur \"" + userId  + "\" n'a pas une playlist avec le nom "+ id + " dans la base de donnée Playlist !")
    
    }


}



function check() {

    if(fs.existsSync(__glob.PLAYLIST)) {

        playlists = JSON.parse(fs.readFileSync(__glob.PLAYLIST))
    } else {

        fs.writeFileSync(__glob.PLAYLIST, JSON.stringify({
            "shared": {

            }
        }, null, 2))
    }
}

function checkSharedMusic(id, originalUserId) {
    for(var playlist in playlists["shared"]) {
        if(playlist == id) {
            return "shared"  
        }
    }

    return originalUserId
}