/// <reference types="../../../CTAutocomplete" />
/// <reference lib="es2015" />
import { SoopyRenderEvent } from "../../../guimanager";
import ButtonWithArrowAndDescription from "../../../guimanager/GuiElement/ButtonWithArrowAndDescription";
import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement";
import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement";
import BoxWithLoading from "../../../guimanager/GuiElement/BoxWithLoading";
import Feature from "../../featureClass/class";
import GuiPage from "../soopyGui/GuiPage";

class FriendsGui extends Feature {
    constructor() {
        super()
    }

    onEnable(){
        this.initVariables()

        this.GuiPage = new SettingPage()

        this.registerChat("&9&m-----------------------------------------------------&r&9${*}&r&9             ${*} &6Friends (Page ${pagenum} of ${maxpages})${friendslist}&r&9&m-----------------------------------------------------&r", (...args)=>{this.GuiPage.friendListMessageEvent.call(this.GuiPage, ...args)})
        this.registerStep(true, 5,  ()=>{this.GuiPage.regenGuiElements.call(this.GuiPage)})
    }

    initVariables(){
        this.GuiPage = undefined
    }

    onDisable(){
        this.initVariables()
    }
}


class SettingPage extends GuiPage {
    constructor(){
        super(7)
        
        this.name = "Friends"

        this.pages = [this.newPage()]

        this.lastRender = 0

        this.pages[0].addEvent(new SoopyRenderEvent().setHandler(()=>{this.lastRender = Date.now()}))
        
        
        let friendsTitle = new SoopyTextElement().setText("ยง0Friends").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1)
        this.pages[0].addChild(friendsTitle)

        this.friendsArea = new SoopyGuiElement().setLocation(0.1, 0.2, 0.8, 0.8).setScrollable(true)
        this.pages[0].addChild(this.friendsArea)

        this.loadedFriends = {}

        this.pageCount = undefined

        this.heightPerFriend = 0.2
        this.loadingElement = new BoxWithLoading().setLocation(0,0, 1, 0.175)
        this.lastLoadedPage = 0
        this.maxLoadedPage = 0

        this.loadingElement.addEvent(new SoopyRenderEvent().setHandler(()=>{
            if(Date.now()-this.lastLoadedPage > 1000){
                this.loadFriendPage(this.maxLoadedPage+1)
            }
        }))


        this.finaliseLoading()
    }

    friendListMessageEvent(pagenum, maxpages, friendslist, event){
        if(Date.now()-this.lastRender < 1000){
            cancel(event)
            // console.log("Canceling")
        }else{
            return
        }
        
        this.maxLoadedPage = parseInt(pagenum)

        this.pageCount = parseInt(maxpages)

        friendslist = friendslist.replace(/\-\>newLine\<\-/g,"\n").split("\n")
        friendslist.shift()

        friendslist.pop()

        friendslist.forEach((line, i) => {
            let [name, location] = line.split(" is ")

            if(location){
                if(this.loadedFriends[ChatLib.removeFormatting(name)]){
                    this.loadedFriends[ChatLib.removeFormatting(name)].nameWithFormatting = name
                    this.loadedFriends[ChatLib.removeFormatting(name)].currentGame = location.replace("in ", "").replace("currently offline", "&cCurrently offline")
                    this.loadedFriends[ChatLib.removeFormatting(name)].element.setText(name).setDesc("&7"+location.replace("in ", "").replace("currently offline", "&cCurrently offline"))
                }else{
                    this.loadedFriends[ChatLib.removeFormatting(name)] = {
                        nameWithFormatting: name,
                        currentGame: location.replace("in ", "").replace("currently offline", "&cCurrently offline"),
                        element:  new ButtonWithArrowAndDescription().setLocation(0, this.heightPerFriend*Object.keys(this.loadedFriends).length+1, 1, this.heightPerFriend*0.875).setText(name).setDesc("&7"+location.replace("in ", "").replace("currently offline", "&cCurrently offline"))
                    }
                    this.loadedFriends[ChatLib.removeFormatting(name)].element.location.location.y.set(this.heightPerFriend*Object.keys(this.loadedFriends).length-this.heightPerFriend, 500+100*i)
                }
            }
        });

        this.regenGuiElements()
    }

    regenGuiElements(){
        if(Date.now()-this.lastRender < 1000){
            this.friendsArea.children = []

            let scroll = this.friendsArea.location.scroll.y.get()/this.friendsArea.location.getHeightExact()

            let minY = -scroll-this.heightPerFriend*0.875-0.5

            let maxY = -scroll+1.5

            Object.keys(this.loadedFriends).forEach((ign, i)=>{
                if(this.loadedFriends[ign].element.location.location.y.get() > minY && this.loadedFriends[ign].element.location.location.y.get() < maxY){
                    this.friendsArea.addChild(this.loadedFriends[ign].element)
                }
            })
            
            this.loadingElement.location.location.y.set(this.heightPerFriend*Object.keys(this.loadedFriends).length, 500)
            this.friendsArea.addChild(this.loadingElement)
                
            if(this.maxLoadedPage !== this.pageCount){
                this.loadingElement.visable = true
            }else{
                this.loadingElement.visable = false
            }
        }
    }

    loadFriendPage(page){
        ChatLib.command("friends list " + page)
        this.lastLoadedPage = Date.now()
    }

    onOpen(){
        this.loadedFriends = {}
        this.pageCount = undefined
        this.lastLoadedPage = 0
        this.maxLoadedPage = 0

        this.regenGuiElements()

        this.loadFriendPage(1)
    }
}

module.exports = {
    class: new FriendsGui()
}