// components/contentstream/contentstream.js
Component({

    /**
     * Component properties
     */
    properties: {
        content: {
            type: Array,
            value: []
        },
        is_prompt: {
            type: Boolean,
        },
    },

    /**
     * Component initial data
     */
    data: {
        visible_content: [],
        next_index: 0,
        next_offset: 0,
    },

    /**
     * Component methods
     */
    methods: {
        restart_content_output() {
            console.log('restart_content_output');
            if (this.properties.is_prompt) {
                this.setData({
                    visible_content: this.properties.content
                });
                return;
            }
            this.setData({
                visible_content: [],
                next_index: 0,
                next_offset: 0,
            });
            setTimeout(() => {
                this.update_interval = setInterval(() => {
                    this.update_visible_content();
                }, 50);
            }, 500);
        },
        handle_onclick(event) {
            var index = event.currentTarget.dataset.index;  
            if (this.properties.content[index].onclick) {
                console.log('call onclick');
                this.properties.content[index].onclick();
            }
        },
        update_visible_content() {
            if (this.data.next_index >= this.properties.content.length) {
                clearInterval(this.update_interval);
                return;
            }
            var next_entry = this.properties.content[this.data.next_index];
            if (next_entry.type != 'text') {
                // just add the next entry to the visible content
                this.setData({
                    visible_content: this.data.visible_content.concat(next_entry),
                    next_index: this.data.next_index + 1,
                    next_offset: 0
                });
                return;
            }
            if (this.data.next_offset >= next_entry.content.length) {
                // end of current entry, move to the next entry
                this.setData({
                    next_index: this.data.next_index + 1,
                    next_offset: 0,
                })
                return;
            }
            // here we have some remaining text to add to the last visible content
            if (this.data.next_offset == 0) {
                var next_entry = this.properties.content[this.data.next_index];
                var new_entry = JSON.parse(JSON.stringify(next_entry));
                new_entry.content = "";
                this.setData({
                    visible_content: this.data.visible_content.concat(new_entry)
                });
            }
            var last_visible_entry = this.data.visible_content[this.data.visible_content.length - 1];
            var new_text = next_entry.content.slice(this.data.next_offset, this.data.next_offset + 1);
            last_visible_entry.content = last_visible_entry.content + new_text;
            this.setData({
                visible_content: this.data.visible_content.slice(0, this.data.visible_content.length - 1).concat(last_visible_entry),
                next_offset: this.data.next_offset + 1,
            });
        }

    },
    ready() {
        this.restart_content_output();
    },
    detached() {
        clearInterval(this.update_interval);
    },
})