const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");

class Mattermost extends NotificationProvider {

    name = "mattermost";

    /**
     * @inheritdoc
     */
    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
        let okMsg = "Sent Successfully.";
        try {
            const mattermostUserName = notification.mattermostusername || "Uptime Kuma";
            // If heartbeatJSON is null, assume non monitoring notification (Certificate warning) or testing.
            if (heartbeatJSON == null) {
                let mattermostTestData = {
                    username: mattermostUserName,
                    text: msg,
                };
                await axios.post(notification.mattermostWebhookUrl, mattermostTestData);
                return okMsg;
            }

            let mattermostChannel;

            if (typeof notification.mattermostchannel === "string") {
                mattermostChannel = notification.mattermostchannel.toLowerCase();
            }

            const mattermostIconEmoji = notification.mattermosticonemo;
            let mattermostIconEmojiOnline = "";
            let mattermostIconEmojiOffline = "";

            if (mattermostIconEmoji && typeof mattermostIconEmoji === "string") {
                const emojiArray = mattermostIconEmoji.split(" ");
                if (emojiArray.length >= 2) {
                    mattermostIconEmojiOnline = emojiArray[0];
                    mattermostIconEmojiOffline = emojiArray[1];
                }
            }
            const mattermostIconUrl = notification.mattermosticonurl;
            let iconEmoji = mattermostIconEmoji;
            let statusField = {
                short: false,
                title: "Error",
                value: heartbeatJSON.msg,
            };
            let statusText = "unknown";
            let color = "#000000";
            if (heartbeatJSON.status === DOWN) {
                iconEmoji = mattermostIconEmojiOffline || mattermostIconEmoji;
                statusField = {
                    short: false,
                    title: "Error",
                    value: heartbeatJSON.msg,
                };
                statusText = "down.";
                color = "#FF0000";
            } else if (heartbeatJSON.status === UP) {
                iconEmoji = mattermostIconEmojiOnline || mattermostIconEmoji;
                statusField = {
                    short: false,
                    title: "Ping",
                    value: heartbeatJSON.ping + "ms",
                };
                statusText = "up!";
                color = "#32CD32";
            }

            let mattermostdata = {
                username: monitorJSON.name + " " + mattermostUserName,
                channel: mattermostChannel,
                icon_emoji: iconEmoji,
                icon_url: mattermostIconUrl,
                attachments: [
                    {
                        fallback:
                            "Your " +
                            monitorJSON.pathName +
                            " service went " +
                            statusText,
                        color: color,
                        title:
                            monitorJSON.pathName +
                            " service went " +
                            statusText,
                        title_link: monitorJSON.url,
                        fields: [
                            statusField,
                            {
                                short: true,
                                title: `Time (${heartbeatJSON["timezone"]})`,
                                value: heartbeatJSON.localDateTime,
                            },
                        ],
                    },
                ],
            };
            await axios.post(
                notification.mattermostWebhookUrl,
                mattermostdata
            );
            return okMsg;
        } catch (error) {
            this.throwGeneralAxiosError(error);
        }

    }
}

module.exports = Mattermost;
