module.exports = function(RED) {
    function MatrixReceiveMessage(n) {
        RED.nodes.createNode(this, n);

        let node = this;

        this.name = n.name;
        this.server = RED.nodes.getNode(n.server);
        this.acceptText = n.acceptText;
        this.acceptEmotes = n.acceptEmotes;
        this.acceptStickers = n.acceptStickers;
        this.acceptReactions = n.acceptReactions;
        this.acceptFiles = n.acceptFiles;
        this.acceptImages = n.acceptImages;
        this.roomId = n.roomId;
        this.roomIds = this.roomId ? this.roomId.split(',') : [];

        node.status({ fill: "red", shape: "ring", text: "disconnected" });

        if (!node.server) {
            node.error("No configuration node");
            return;
        }

        node.server.on("disconnected", function(){
            node.status({ fill: "red", shape: "ring", text: "disconnected" });
        });

        node.server.on("connected", function() {
            node.status({ fill: "green", shape: "ring", text: "connected" });
        });

        node.server.on("Room.timeline", async function(event, room, toStartOfTimeline, removed, data, msg) {
            // if node has a room ID set we only listen on that room
            if(node.roomIds.length && node.roomIds.indexOf(room.roomId) === -1) {
                return;
            }

            switch(msg.type) {
                case 'm.emote':
                    if(!node.acceptEmotes) return;
                    break;

                case 'm.text':
                    if(!node.acceptText) return;
                    break;

                case 'm.sticker':
                    if(!node.acceptStickers) return;
                    if(msg.content.info) {
                        if(msg.content.info.thumbnail_url) {
                            msg.thumbnail_url = node.server.matrixClient.mxcUrlToHttp(msg.content.info.thumbnail_url);
                            msg.thumbnail_mxc_url = msg.content.info.thumbnail_url;
                        }

                        if(msg.content.url) {
                            msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
                            msg.mxc_url = msg.content.url;
                        }
                    }
                    break;

                case 'm.file':
                    if(!node.acceptFiles) return;
                    msg.filename = msg.content.filename || msg.content.body;
                    if(msg.encrypted) {
                        msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.file.url);
                        msg.mxc_url = msg.content.file.url;
                    } else {
                        msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
                        msg.mxc_url = msg.content.url;
                    }
                    break;

                case 'm.image':
                    if(!node.acceptImages) return;
                    msg.filename = msg.content.filename || msg.content.body;
                    if(msg.encrypted) {
                        msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.file.url);
                        msg.mxc_url = msg.content.file.url;
                        msg.thumbnail_url = node.server.matrixClient.mxcUrlToHttp(msg.content.info.thumbnail_file.url);
                        msg.thumbnail_mxc_url = msg.content.info.thumbnail_file.url;
                    } else {
                        msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
                        msg.mxc_url = msg.content.url;
                        msg.thumbnail_url = node.server.matrixClient.mxcUrlToHttp(msg.content.info.thumbnail_url);
                        msg.thumbnail_mxc_url = msg.content.info.thumbnail_url;
                    }
                    break;

                case 'm.reaction':
                    if(!node.acceptReactions) return;
                    msg.info = msg.content["m.relates_to"].info;
                    msg.referenceEventId = msg.content["m.relates_to"].event_id;
                    msg.payload = msg.content["m.relates_to"].key;
                    break;

                default:
                    // node.warn("Unknown event type: " + msg.type);
                    return;
            }

            node.send(msg);
        });
    }
    RED.nodes.registerType("matrix-receive", MatrixReceiveMessage);
}