CCCPaste

02.Story

class Story {
    #likes=[];
    constructor (title, creator){
        this.title=title;
        this.creator=creator;
        this.comments=[];
        this.currentCommentId=0;
        this.likesArr=[];
        }



        like(username){
            if (this.#likes.includes(username)){
                console.log('You cant like the same story twice!');
              throw new Error  (`You can't like the same story twice!`)
            }
            if (this.creator==username){
                throw new Error (`You can't like your own story!"`)
            }
           let userExists=false;
           for (let i=0; i1){
                return `${this.#likes[0]} and ${this.#likes.length-1} others like this story!`
            }
        }

        dislike(username){
            //decrease dislikes once I figure em out
            if (this.#likes.includes(username)==false){
                throw new Error (`You can't dislike this story!`);
            } else {
                this.#likes.splice(this.#likes.indexOf(username));
                return `${username} disliked ${this.title}`
            }
        }

        comment(username, content, id){
            let existingComment=this.comments.find(c=>c.id==id);
            if (existingComment==undefined){
                this.currentCommentId++;
                let newComment=
                    {id:this.currentCommentId,
                         username:username, content:content,replies:[]

                        }
                        this.comments.push(newComment);
                        return `${username} commented on ${this.title}`
                } else {
                    let replyId=`${existingComment.id}.${existingComment.replies.length+1}`
                    let newReply={id:replyId,username,content};
                    existingComment.replies.push(newReply);
                    return `You replied successfully`

                        
                }
              

            }

           toString(sortingType){
            let res=`Title: ${this.title}\n`
            res+=`Creator: ${this.creator}\n`;
            res+=`Likes: ${this.#likes.length}\n`
            res+=`Comments:\n`


            let commentsStr="";
            let commentsArr=[]

            if (sortingType=="asc"){
                this.comments.forEach(c=>{
                    commentsStr+=(`-- ${c.id}. ${c.username}: ${c.content}\n`);
                    if (c.replies.length>0){
                        c.replies.forEach(r=>{
                            commentsStr+=`--- ${r.id}. ${r.username}: ${r.content}\n`
                        })
                    }
                })
                res+=commentsStr.trim();
            }


            if (sortingType=='desc'){
            let descendComments=[];
            for (let i=this.comments.length-1; i>=0; i--){
                let currCom=this.comments[i];
                console.log(currCom)
                currCom.replies.reverse();
                descendComments.push(currCom)
            }
            let commStr=``
            descendComments.forEach(c=>{
                commStr+=`-- ${c.id}. ${c.username}: ${c.content}\n`;
                if (c.replies.length>0){
                    c.replies.forEach(r => {
                        commStr+=`--- ${r.id}. ${r.username}: ${r.content}\n`
                    });
                }
            })
            res+=commStr.trim();
        }

        if (sortingType=="username"){
            let usernameSorted=this.comments.sort((a,b)=>a.username.localeCompare(b.username));

            usernameSorted.forEach(u=>{
                u.replies.sort((a,b)=>a.username.localeCompare(b.username))
            })

            let unStr="";
            usernameSorted.forEach(u=>{
                unStr+=`-- ${u.id}. ${u.username}: ${u.content}\n`;
                if (u.replies.length>0){
                    u.replies.forEach(r => {
                        unStr+=`--- ${r.id}. ${r.username}: ${r.content}\n`
                    });
            }
            })
            res+=unStr.trim();
        }
        

return res;
           }
        }