class commandPreprocessor{
    constructor(client){
        this.client = client;
        this.commandProcessor = new commandProcessor(client);
    }

    preprocess(command){
        //Set command and sendFlag
        this.command = command;
        this.sendFlag = true;

        this.processLocalCommand();

        if(this.sendFlag){
            this.message = command;
            this.processLinks();
            this.sendRemoteCommand();
        }
    }

    processLocalCommand(){
        //Create an empty array to hold the command
        this.commandArray = [];
        //Split string by words
        this.commandArray = this.command.split(/\b/g);//Split by word-borders
        this.argumentArray = this.command.match(/\b\w+\b/g);//Match by words surrounded by borders

        //If this is a local command
        if(this.commandArray[0] == '/'){
            //If the command exists
            if(this.argumentArray != null && this.commandProcessor[this.argumentArray[0].toLowerCase()] != null){
                //Don't send it to the server
                this.sendFlag = false;

                //Call the command with the argument array
                this.commandProcessor[this.argumentArray[0].toLowerCase()](this.argumentArray, this.commandArray);
            }
        }
    }

    processLinks(){
        //Strip out file seperators in-case the user is being a smart-ass
        this.message = this.message.replaceAll('␜','');
        //Split message by links
        var splitMessage = this.message.split(/(https?:\/\/[^\s]+)/g);
        //Create an empty array to hold links
        this.links = [];

        splitMessage.forEach((chunk, chunkIndex) => {
            if(chunk.match(/(https?:\/\/[^\s]+)/g)){
                //I looked online for obscure characters that no one would use to prevent people from chatting embed placeholders
                //Then I found this fucker, turns out it's literally made for the job lmao (even if it was originally intended for paper/magnetic tape)
                //Replace link with indexed placeholder
                splitMessage[chunkIndex] = `␜${this.links.length}`

                //push current chunk as link
                this.links.push(chunk);
            }
        });

        //Join the message back together
        this.message = splitMessage.join('');
    }

    sendRemoteCommand(){
        this.client.socket.emit("chatMessage",{msg: this.message, links: this.links});
    }


}

class commandProcessor{
    constructor(client){
        this.client = client
    }

    high(argumentArray){
        //If we have an argument
        if(argumentArray[1]){
            //Use it to set our high level
            //Technically this is less of a local command than it would be if it where telling the select to do this
            //but TTN used to treat this as a local command so fuck it
            this.client.socket.emit("setHighLevel", {highLevel: argumentArray[1]}); 
        }
    }
}