class ChatMessagePart {
    private internal: any = {}

    get text() {
        return this.internal.text
    }
    set text(text: string) {
        this.internal.text = text
    }

    click(action: string, value: string) {
        this.internal.clickEvent = { action, value }
    }

    hover(action: string, value: string) {
        this.internal.hoverEvent = { action, value }
    }

    convert() {
        return this.internal;
    }
}

class Tellraw {
    static duplicateChar = '§卐'
    static create() {
        return new Tellraw().then(Tellraw.duplicateChar);
    }

    private cache: string = '';
    private parts = [new ChatMessagePart()];

    then(part: ChatMessagePart | string) {
        if (typeof part === "string") {
            var newPart = new ChatMessagePart();
            newPart.text = part
            this.then(newPart);
            return this;
        }
        var last = this.latest();
        if (!last.text) {
            last.text = part.text;
        } else {
            this.parts.push(part);
        }
        this.cache = null;
    }

    text(text: string) {
        this.latest().text = text;
        return this;
    }

    tip(text: string) {
        this.latest().hover("show_text", text);
        return this;
    }

    item(text: string) {
        this.latest().hover("show_item", text);
        return this;
    }

    command(command: string) {
        this.latest().click("run_command", command);
        return this;
    }

    suggest(url: string) {
        this.latest().click("suggest_command", url);
        return this;
    }

    file(path: string) {
        this.latest().click("open_file", path);
        return this;
    }

    link(url: string) {
        this.latest().click("open_url", url);
        return this;
    }

    latest() {
        return this.parts[this.parts.length - 1];
    }

    json() {
        if (!this.cache) {
            var temp = [];
            this.parts.forEach(t => {
                temp.push(t.convert());
            });
            this.cache = JSON.stringify(temp);
            console.trace(this.cache);
        }
        return this.cache;
    }

    string() {
        var temp = '';
        this.parts.forEach(t => {
            temp += t.text
        });
        return temp;
    }
}

export default Tellraw
