import LLM from "./llm";

export class Shyguy {
    constructor() {
        this.num_beers = 0;
        this.courage = 1;
        this.personality = "This is the Shyguy. He is shy and introverted. He is also a bit of a nerd. He fell in love with Jessica. With Jessica, he talks about algorithms.";
        this.lessons_learned = "";
        this.conversation_history = "";
        this.song_playing = "Let it be";
        this.imgpath = "assets/assets/shyguy_headshot.jpeg";
        this.last_actions = [];
    }

    getSystemPrompt() {
        if (this.num_beers >= 3) {
            return `${this.personality}. His courage is ${this.courage} on the level 1 to 10. If his courage is higher than 5, he is self-confident. He had too many beers and he is drunk. He talks about how drunk he is. Follow the following lessons: ${this.lessons_learned}`;
        } else if (this.num_beers == 2) {
            return `This is Shyguy. He had two beers, so he feels relaxed and he can talk with anyone. Follow the following lessons: ${this.lessons_learned}`;
        }
        else {
            return `${this.personality}. He had ${this.num_beers} numbers of beers and his courage is ${this.courage} on the level 1 to 10. If his courage is higher than 5, he is self-confident. After having 3 bears, he says single words with a lot of hesitation and says that he feels bad and he talks about how drunk he is. If courage is low, he hesitates to speak. Follow the following lessons: ${this.lessons_learned}`;
        }
    }

    appendLesson(lesson) {
        this.lessons_learned += lesson + "\n";
    }

    appendConversationHistory(conversation_history) {
        this.conversation_history += conversation_history + "\n";
    }

    async learnLesson(entityName){
        const summaryLLM = new LLM();
        const summary = await summaryLLM.getChatCompletion(
            `Summarize in one sentence what Shyguy should say when talking to ${entityName}. Do not confuse Jessica and Jessica's sister. If there is nothing relevant about what to say to Jessica, say Nothing relevant.`,
            this.conversation_history
        );
        this.appendLesson(`When talking to ${entityName}, ${summary}`);
    }

    async learnFromWingman(wingman_message) {
        const summaryLLM = new LLM();
        console.log("Wingman message: ", wingman_message);
        const summary = await summaryLLM.getChatCompletion(
            `Give a summary of what is learned from the message. Summary is one sentence. The wingman is always talking. For example, if the wingman says "Let's have a beer", the output should be "Shyguy wants a beer". If the wingman says "Let's have vodka", the output should be "Shyguy wants vodka".`,
            wingman_message
        );
        this.appendLesson(summary);
    }

    getAvailableActions() {
        let actions = {};
        const lastAction = this.last_actions[this.last_actions.length - 1];

        // When sober, can only go to the bar or home
        if (this.num_beers === 0) {
            actions = {
                "go_bar": {
                    description: "Head to the bar.",
                    location: "bar",
                },
                "go_home": {
                    description: "Give up and head home",
                    location: "exit",
                },
                "stay_idle": {
                    description: "Stay idle",
                    location: "idle",
                }
            };
        }
        else if (this.num_beers >= 2) {
            // After 2+ beers, all actions except going home are available
            actions = {
                "go_bar": {
                    description: "Head to the bar for liquid courage", 
                    location: "bar",
                },
                "go_dj": {
                    description: "Talk to the DJ about playing a song",
                    location: "dj_booth",
                },
                "go_sister": {
                    description: "Approach your crush's sister",
                    location: "sister",
                },
                "go_girl": {
                    description: "Approach your crush",
                    location: "girl",
                }
            };
        } else {
            // After 1 beer but less than 2, all actions are available
            actions = {
                "go_bar": {
                    description: "Head to the bar for liquid courage",
                    location: "bar",
                },
                "go_home": {
                    description: "Give up and head home",
                    location: "exit",
                },
                "go_dj": {
                    description: "Talk to the DJ about playing a song",
                    location: "dj_booth",
                },
                "go_sister": {
                    description: "Approach your crush's sister",
                    location: "sister",
                },
                "go_girl": {
                    description: "Approach your crush",
                    location: "girl",
                }
            };
        }

        // Remove the last action from available actions
        if (lastAction && actions[lastAction]) {
            delete actions[lastAction];
        }

        return actions;
    }
}