// ==SE_module==
// name: daily_news
// displayName: Daily News
// description: A script that shows daily news as a dialog on Snapchat startup.
// version: 2.2
// author: Suryadip Sarkar
// updateUrl: https://raw.githubusercontent.com/suryadip2008/SE-Scripts/main/scripts/daily_news.js
// ==/SE_module==

var networking = require("networking");
var im = require("interface-manager");
var config = require("config");
var goodbyePrompt = "Sorry to see you go :( I hope you liked my script :D";
var hasShownWelcome = "hasShownWelcome";

if (!config.getBoolean(hasShownWelcome, false)) {
    longToast("Thank you for installing my script! Hope you like it :D");
    config.setBoolean(hasShownWelcome, true, true);
}

var owner = "suryadip2008";
var repo = "SE-Scripts";
var scriptName = "daily_news";
var currentVersion = "v2.2";
let updateAvailable = false;

var versionJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/main/version.json`;
var messagesJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/main/messages.json`;

function checkForNewVersion() {
    networking.getUrl(versionJsonUrl, (error, response) => {
        if (error) {
            console.error("Error fetching version.json:", error);
            return;
        }
        try {
            var versions = JSON.parse(response);
            var latestVersion = versions[scriptName];
            if (currentVersion !== latestVersion) {
                longToast("A new version of daily news is available! Please refresh the scripts page.");
                updateAvailable = true;
            }
        } catch (e) {
            console.error("Error parsing version.json:", e);
        }
    });
}

function checkForNewMessages() {
    networking.getUrl(messagesJsonUrl, (error, response) => {
        if (error) {
            console.error("Error fetching messages.json:", error);
            return;
        }
        try {
            var messages = JSON.parse(response);
            for (var i = 0; i < messages.length; i++) {
                var message = messages[i];
                var messageId = message.id;
                if (!config.getBoolean(`message_${messageId}`, false)) {
                    longToast(message.text);
                    config.setBoolean(`message_${messageId}`, true);
                    config.save();
                    break;
                }
            }
        } catch (e) {
            console.error("Error parsing messages.json:", e);
        }
    });
}

var defaultFontSize = 18;
var defaultFontColor = "#FFFFFF";
var defaultLanguage = "en";
var languages = {
    "en": "English",
    "pt": "Portuguese",
    "pa": "Punjabi",
    "fr": "French",
    "de": "German",
    "ru": "Russian",
    "ar": "Arabic"
};

var settingsContext = {
    events: [],
};

var translations = {
    en: {
        today: "Today's News",
        moreScripts: "More Scripts",
        scriptsAvailable: "The below scripts are available for download in the Scripts Repository.",
        scheduledMessages: "1. Scheduled Messages",
        messageBomber: "2. Message Bomber",
        greetingsToast: "3. Greetings Toast",
        flexiQuotes: "4. Flexi Quotes",
        customReminders: "5. Custom Reminders",
        savedReplies: "6. Saved Replies",
        customToast: "7. Custom Toast",
        returnBack: "⬅️ Return",
        moduleInfo: "ℹ️ Module Information:",
        moduleName: "Name:",
        moduleAuthor: "Author:",
        moduleDisplayName: "Display Name:",
        moduleVersion: "Version:",
        moduleDescription: "Description:",
        refresh: "🔄️ Refresh",
        allRead: "✅ All news have been read!",
        nextUpdate: "⌛Please wait for the next news update schedule for the next batch of news.",
        newUpdateAvailable: "📢 A new update is available! Please refresh the scripts page & then click on Update Module.",
        understood: "Understood!" 
    },
    pt: {
        today: "Notícias de hoje",
        moreScripts: "Mais Scripts",
        scriptsAvailable: "Os scripts abaixo estão disponíveis para download no Repositório de Scripts.",
        scheduledMessages: "1. Mensagens Agendadas",
        messageBomber: "2. Bombardeiro de Mensagens",
        greetingsToast: "3. Boas-vindas Toast",
        flexiQuotes: "4. Citações Flexíveis",
        customReminders: "5. Lembretes Personalizados",
        savedReplies: "6. Respostas Salvas",
        customToast: "7. Toast Personalizado",
        returnBack: "⬅️ Voltar",
        moduleInfo: "ℹ️ Informações do Módulo:",
        moduleName: "Nome:",
        moduleAuthor: "Autor:",
        moduleDisplayName: "Nome de Exibição:",
        moduleVersion: "Versão:",
        moduleDescription: "Descrição:",
        refresh: "🔄️ Atualizar",
        allRead: "✅ Todas as notícias foram lidas!",
        nextUpdate: "⌛Por favor, aguarde o próximo cronograma de atualização de notícias para o próximo lote de notícias.",
        newUpdateAvailable: "📢 Uma nova atualização está disponível! Atualize a página de scripts e clique em Atualizar Módulo.",
        understood: "Entendi!"
    },
    pa: {
        today: "ਅੱਜ ਦੀ ਖਬਰ",
        moreScripts: "ਹੋਰ ਸਕ੍ਰਿਪਟਾਂ",
        scriptsAvailable: "ਹੇਠਾਂ ਦਿੱਤੇ ਸਕ੍ਰਿਪਟ ਸਕ੍ਰਿਪਟ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਡਾਊਨਲੋਡ ਲਈ ਉਪਲਬਧ ਹਨ।",
        scheduledMessages: "1. ਤਹਿ ਕੀਤੇ ਸੁਨੇਹੇ",
        messageBomber: "2. ਸੁਨੇਹਾ ਬੰਬਾਰ",
        greetingsToast: "3. ਸ਼ੁਭਕਾਮਨਾਵਾਂ ਟੋਸਟ",
        flexiQuotes: "4. ਫਲੈਕਸੀ ਹਵਾਲੇ",
        customReminders: "5. ਕਸਟਮ ਰਿਮਾਈਂਡਰ",
        savedReplies: "6. ਸੁਰੱਖਿਅਤ ਕੀਤੇ ਜਵਾਬ",
        customToast: "7. ਕਸਟਮ ਟੋਸਟ",
        returnBack: "⬅️ ਵਾਪਸ ਜਾਓ",
        moduleInfo: "ℹ️ ਮੋਡੀਊਲ ਜਾਣਕਾਰੀ:",
        moduleName: "ਨਾਮ:",
        moduleAuthor: "ਲੇਖਕ:",
        moduleDisplayName: "ਪ੍ਰਦਰਸ਼ਨ ਨਾਮ:",
        moduleVersion: "ਵਰਜਨ:",
        moduleDescription: "ਵਿਆਖਿਆ:",
        refresh: "🔄️ ਤਾਜ਼ਾ ਕਰੋ",
        allRead: "✅ ਸਾਰੀਆਂ ਖ਼ਬਰਾਂ ਪੜ੍ਹੀਆਂ ਗਈਆਂ ਹਨ!",
        nextUpdate: "⌛ਅਗਲੇ ਖ਼ਬਰਾਂ ਦੇ ਅਪਡੇਟ ਸ਼ਡਿਊਲ ਦੀ ਉਡੀਕ ਕਰੋ।",
        newUpdateAvailable: "📢 ਇੱਕ ਨਵਾਂ ਅੱਪਡੇਟ ਉਪਲਬਧ ਹੈ! ਕਿਰਪਾ ਕਰਕੇ ਸਕ੍ਰਿਪਟਾਂ ਵਾਲੇ ਪੰਨੇ ਨੂੰ ਤਾਜ਼ਾ ਕਰੋ ਅਤੇ ਅੱਪਡੇਟ ਮੋਡੀਊਲ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।",
        understood: "ਸਮਝ ਆ ਗਿਆ!"
    },
    de: {
        today: "Aktuelle Nachrichten",
        moreScripts: "Weitere Skripte",
        scriptsAvailable: "Die folgenden Skripte stehen im Skript-Repository zum Download bereit.",
        scheduledMessages: "1. Geplante Nachrichten",
        messageBomber: "2. Nachrichtenbomber",
        greetingsToast: "3. Gruß-Toast",
        flexiQuotes: "4. Flexi-Zitate",
        customReminders: "5. Benutzerdefinierte Erinnerungen",
        savedReplies: "6. Gespeicherte Antworten",
        customToast: "7. Benutzerdefinierter Toast",
        returnBack: "⬅️ Zurück",
        moduleInfo: "ℹ️ Modulinformationen:",
        moduleName: "Name:",
        moduleAuthor: "Autor:",
        moduleDisplayName: "Anzeigename:",
        moduleVersion: "Version:",
        moduleDescription: "Beschreibung:",
        refresh: "🔄️ Aktualisieren",
        allRead: "✅ Alle Nachrichten wurden gelesen!",
        nextUpdate: "⌛Bitte warten Sie auf den nächsten Nachrichten-Update-Zeitplan für den nächsten Nachrichtenstapel.",
        newUpdateAvailable: "📢 Ein neues Update ist verfügbar! Bitte aktualisieren Sie die Skriptseite und klicken Sie dann auf Modul aktualisieren.",
        understood: "Verstanden!"
    },
    ru: {
        today: "Сегодняшние новости",
        moreScripts: "Больше скриптов",
        scriptsAvailable: "Приведенные ниже скрипты доступны для скачивания в репозитории скриптов.",
        scheduledMessages: "1. Запланированные сообщения",
        messageBomber: "2. Бомбардировщик сообщений",
        greetingsToast: "3. Приветственный тост",
        flexiQuotes: "4. Гибкие цитаты",
        customReminders: "5. Пользовательские напоминания",
        savedReplies: "6. Сохраненные ответы",
        customToast: "7. Пользовательский тост",
        returnBack: "⬅️ Вернуться",
        moduleInfo: "ℹ️ Информация о модуле:",
        moduleName: "Название:",
        moduleAuthor: "Автор:",
        moduleDisplayName: "Отображаемое имя:",
        moduleVersion: "Версия:",
        moduleDescription: "Описание:",
        refresh: "🔄️ Обновить",
        allRead: "✅ Все новости прочитаны!",
        nextUpdate: "⌛Пожалуйста, дождитесь следующего расписания обновления новостей для следующей партии новостей.",
        newUpdateAvailable: "📢 Доступно новое обновление! Пожалуйста, обновите страницу скриптов и нажмите кнопку «Обновить модуль».",
        understood: "Понял!"
    },
    ar: {
        today: "أخبار اليوم",
        moreScripts: "المزيد من البرامج النصية",
        scriptsAvailable: "البرامج النصية أدناه متاحة للتنزيل في مستودع البرامج النصية.",
        scheduledMessages: "1. رسائل مجدولة",
        messageBomber: "2. قاذفة الرسائل",
        greetingsToast: "3. تحية محمصة",
        flexiQuotes: "4. اقتباسات مرنة",
        customReminders: "5. تذكيرات مخصصة",
        savedReplies: "6. الردود المحفوظة",
        customToast: "7. نخب مخصص",
        returnBack: "⬅️ عودة",
        moduleInfo: "ℹ️ معلومات الوحدة:",
        moduleName: "اسم:",
        moduleAuthor: "المؤلف:",
        moduleDisplayName: "اسم العرض:",
        moduleVersion: "الإصدار:",
        moduleDescription: "الوصف:",
        refresh: "🔄️ تحديث",
        allRead: "✅ تم قراءة جميع الأخبار!",
        nextUpdate: "⌛يرجى انتظار جدول تحديث الأخبار التالي للدفعة التالية من الأخبار.",
        newUpdateAvailable: "📢 يتوفر تحديث جديد! يرجى تحديث صفحة البرامج النصية ثم النقر فوق تحديث الوحدة النمطية.",
        understood: "فهمتك!"
    },
    fr: {
        today: "L'actualité du jour",
        moreScripts: "Plus de Scripts",
        scriptsAvailable: "Les scripts ci-dessous sont disponibles en téléchargement dans le référentiel de scripts.",
        scheduledMessages: "1. Messages planifiés",
        messageBomber: "2. Bombardement de messages",
        greetingsToast: "3. Toast de bienvenue",
        flexiQuotes: "4. Citations Flexi",
        customReminders: "5. Rappels personnalisés",
        savedReplies: "6. Réponses sauvegardées",
        customToast: "7. Toast personnalisé",
        returnBack: "⬅️ Retour",
        moduleInfo: "ℹ️ Informations sur le module:",
        moduleName: "Nom:",
        moduleAuthor: "Auteur:",
        moduleDisplayName: "Nom d'affichage:",
        moduleVersion: "Version:",
        moduleDescription: "Description:",
        refresh: "🔄️ Actualiser",
        allRead: "✅ Toutes les actualités ont été lues!",
        nextUpdate: "⌛Veuillez patienter jusqu'à la prochaine mise à jour des actualités pour le prochain lot d'actualités.",
        newUpdateAvailable: "📢 Une nouvelle mise à jour est disponible! Veuillez actualiser la page des scripts et cliquez ensuite sur Mettre à jour le module.",
        understood: "Compris!"
    }
};

function showNewsDialog(activity, headline, fontSize, fontColor) {
    activity.runOnUiThread(() => {
        var myDialog = im.createAlertDialog(activity, (builder, dialog) => {
            var selectedLanguage = config.get("language", defaultLanguage);
            function t(key) {
                return translations[selectedLanguage][key] || translations['en'][key];
            }
            builder.row(function (builder) {
                builder.text("📰" + t("today"))
                    .fontSize(config.getInteger("todaysNewsFontSize", 25))
                    .color(hexToColor(config.get("todaysNewsFontColor", "#FFFFFF")))
            })
                .arrangement("center")
                .fillMaxWidth();

            builder.text("")
                .fontSize(10);

            builder.text(headline)
                .fontSize(fontSize)
                .color(fontColor);

            builder.text("")
                .fontSize(10);

            builder.row(function (builder) {
                builder.text("_________________________")
                    .fontSize(10)
                    .color(0xFFCCCCCC)
            })
                .arrangement("center")
                .fillMaxWidth();

            builder.row(function (builder) {
                builder.button("📜" + t("moreScripts"), function () {
                    showOtherScriptsDialog(activity);
                    dialog.dismiss();
                });
                builder.button("ℹ️", function () {
                    showModuleInfoDialog(activity);
                    dialog.dismiss();
                });
                builder.button(t("refresh"), function () {
                    fetchAndShowNews(activity);
                    dialog.dismiss();
                });
            })
                .arrangement("center")
                .arrangement("spaceBetween")
                .fillMaxWidth();

            if (updateAvailable) {
                builder.row(function (builder) {
                    builder.text(t("newUpdateAvailable"))
                        .fontSize(12)
                        .padding(4);
                })
                    .arrangement("center")
                    .fillMaxWidth();
            }
        });
        myDialog.show();
    });
}

function showOtherScriptsDialog(activity) {
    activity.runOnUiThread(() => {
        var OtherScriptsDialog = im.createAlertDialog(activity, (builder, dialog) => {
            var selectedLanguage = config.get("language", defaultLanguage);
            function t(key) {
                return translations[selectedLanguage][key] || translations['en'][key];
            }
            builder.row(function (builder) {
                builder.text("📜" + t("moreScripts") + ":")
                    .fontSize(20)
            })
                .arrangement("center")
                .fillMaxWidth();

            builder.text("")
                .fontSize(10);

            builder.text(t("scriptsAvailable"))
                .fontSize(18);
            builder.text("")
                .fontSize(10);
            builder.text(t("scheduledMessages"))
                .fontSize(16);
            builder.text(t("messageBomber"))
                .fontSize(16);
            builder.text(t("greetingsToast"))
                .fontSize(16);
            builder.text(t("flexiQuotes"))
                .fontSize(16);
            builder.text(t("customReminders"))
                .fontSize(16);
            builder.text(t("savedReplies"))
                .fontSize(16);
            builder.text(t("customToast"))
                .fontSize(16);

            builder.text("")
                .fontSize(10);

            builder.row(function (builder) {
                builder.button(t("returnBack"), function () {
                    fetchAndShowNews(activity);
                    dialog.dismiss();
                });
            })
                .arrangement("center")
                .fillMaxWidth();
        });
        OtherScriptsDialog.show();
    });
}

function showModuleInfoDialog(activity) {
    activity.runOnUiThread(() => {
        var infoDialog = im.createAlertDialog(activity, (builder, dialog) => {
            var selectedLanguage = config.get("language", defaultLanguage);
            function t(key) {
                return translations[selectedLanguage][key] || translations['en'][key];
            }
            builder.row(function (builder) {
                builder.text(t("moduleInfo"))
                    .fontSize(20)
            })
                .arrangement("center")
                .fillMaxWidth();

            builder.text("")
                .fontSize(10);

            builder.text(`${t("moduleName")} ${module.info.name}`)
                .fontSize(16);
            builder.text(`${t("moduleAuthor")} ${module.info.author}`)
                .fontSize(16);
            builder.text(`${t("moduleDisplayName")} ${module.info.displayName}`)
                .fontSize(16);
            builder.text(`${t("moduleVersion")} ${module.info.version}`)
                .fontSize(16);
            builder.text(`${t("moduleDescription")} ${module.info.description}`)
                .fontSize(16);

            builder.text("")
                .fontSize(10);

            builder.row(function (builder) {
                builder.button(t("returnBack"), function () {
                    fetchAndShowNews(activity);
                    dialog.dismiss();
                });
            })
                .arrangement("center")
                .fillMaxWidth();
        });
        infoDialog.show();
    });
}

function showAllRead(activity) {
    activity.runOnUiThread(() => {
        var ReadDialog = im.createAlertDialog(activity, (builder, dialog) => {
            var selectedLanguage = config.get("language", defaultLanguage);
            function t(key) {
                return translations[selectedLanguage][key] || translations['en'][key];
            }
            builder.row(function (builder) {
                builder.text(t("allRead"))
                    .fontSize(20)
            })
                .arrangement("center")
                .alignment("centerVertically")
                .fillMaxWidth();

            builder.text("")
                .fontSize(10);

            builder.text(t("nextUpdate"))
                .fontSize(16);

            builder.text("")
                .fontSize(10);

            builder.row(function (builder) {
                builder.button(t("understood"), function () {
                    dialog.dismiss();
                })
            })
                .arrangement("center")
                .fillMaxWidth();
        });
        ReadDialog.show();
    });
}

function fetchAndShowNews(activity) {
    var selectedLanguage = config.get("language", defaultLanguage);
    newsJsonUrl = `https://raw.githubusercontent.com/suryadip2008/SE-Scripts/main/networking/news_${selectedLanguage}.json`;

    networking.getUrl(newsJsonUrl, (error, response) => {
        if (error) {
            console.error("Error fetching news_en.json:", error);
            return;
        }
        try {
            var newsData = JSON.parse(response);
            var headlines = newsData.headlines;

            var allRead = true;
            for (var i = 0; i < headlines.length; i++) {
                if (!config.getBoolean(`headline_${headlines[i]}`, false)) {
                    allRead = false;
                    break;
                }
            }

            if (allRead) {
                showAllRead(activity);
            }

            var unreadHeadlines = [];
            for (var i = 0; i < headlines.length; i++) {
                if (!config.getBoolean(`headline_${headlines[i]}`, false)) {
                    unreadHeadlines.push(headlines[i]);
                }
            }

            if (unreadHeadlines.length > 0) {
                var randomIndex = Math.floor(Math.random() * unreadHeadlines.length);
                var selectedHeadline = unreadHeadlines[randomIndex];

                var fontSize = config.getInteger("fontSize", defaultFontSize);
                var fontColor = hexToColor(config.get("fontColor", defaultFontColor));

                showNewsDialog(activity, selectedHeadline, fontSize, fontColor);

                config.setBoolean(`headline_${selectedHeadline}`, true);
                config.save();
            } else {
                console.log("All headlines have been read.");
            }
        } catch (e) {
            console.error("Error parsing news.json:", e);
        }
    });
}

function createManagerToolBoxUI() {
    settingsContext.events.push({
        start: function (builder) {
            builder.row(function (builder) {
                builder.text("Daily News is enabled.");
            });

            var todaysNewsFontSizes = [18, 22, 26, 30, 34];
            var oldTodaysNewsFontSize = config.getInteger("todaysNewsFontSize", 25);
            builder.row(function (builder) {
                var text = builder.text("Today's News Font Size: " + oldTodaysNewsFontSize);
                builder.slider(0, todaysNewsFontSizes.length - 1, todaysNewsFontSizes.length - 1, todaysNewsFontSizes.indexOf(oldTodaysNewsFontSize), function (value) {
                    var fontSize = todaysNewsFontSizes[value];
                    text.label("Today's News Font Size: " + fontSize);
                    config.setInteger("todaysNewsFontSize", fontSize, true);
                });
            });

            builder.row(function (builder) {
                builder.textInput("Enter Custom Today's News Font Color (hex)", config.get("todaysNewsFontColor", "#FFFFFF"), function (value) {
                    var trimmedValue = value.trim();
                    if (trimmedValue === "") {
                        config.set("todaysNewsFontColor", "#FFFFFF", true);
                    } else {
                        config.set("todaysNewsFontColor", trimmedValue, true);
                    }
                }).maxLines(1)
                    .singleLine(true);
            });

            var fontSizes = [12, 16, 20, 24, 28, 32, 36];
            var oldSelectedFontSize = config.getInteger("fontSize", defaultFontSize);
            builder.row(function (builder) {
                var text = builder.text("Headline Font Size: " + oldSelectedFontSize);
                builder.slider(0, fontSizes.length - 1, fontSizes.length - 1, fontSizes.indexOf(oldSelectedFontSize), function (value) {
                    var fontSize = fontSizes[value];
                    text.label("Headline Font Size: " + fontSize);
                    config.setInteger("fontSize", fontSize, true);
                });
            });

            builder.row(function (builder) {
                builder.textInput("Enter Custom Headline Font Color (hex)", config.get("fontColor", defaultFontColor), function (value) {
                    var trimmedValue = value.trim();
                    if (trimmedValue === "") {
                        config.set("fontColor", defaultFontColor, true);
                    } else {
                        config.set("fontColor", trimmedValue, true);
                    }
                }).maxLines(1)
                    .singleLine(true);
            });

            builder.row(function (builder) {
                builder.button("Test Hex Codes", function () {
                    testHexCode();
                });
            });

            var languageKeys = Object.keys(languages);
            var selectedLanguageIndex = languageKeys.indexOf(config.get("language", defaultLanguage));

            builder.row(function (builder) {
                var text = builder.text("Language: " + languages[languageKeys[selectedLanguageIndex]]);
                builder.slider(0, languageKeys.length - 1, languageKeys.length - 1, selectedLanguageIndex, function (value) {
                    var selectedLanguage = languageKeys[value];
                    text.label("Language: " + languages[selectedLanguage]);
                    config.set("language", selectedLanguage, true);
                });
            });
        },
    });
}

function isValidHex(hex) {
    return /^#([0-9A-Fa-f]{6})$/.test(hex);
}

function testHexCode() {
    const customColor = config.get("fontColor", defaultFontColor);

    if (isValidHex(customColor)) {
        longToast("Entered HEX Code is valid!");
    } else {
        longToast("Entered HEX Code is invalid!");
    }
}

function hexToColor(hex) {
    if (!isValidHex(hex)) {
        return parseInt('FF' + defaultFontColor.substring(1), 16);
    }
    return parseInt('FF' + hex.substring(1), 16);
}

function createInterface() {
    createManagerToolBoxUI();
}

function start(_) {
    createInterface();
}

start();

im.create("settings" /* EnumUI.SETTINGS */, function (builder, args) {
    settingsContext.events.forEach(function (event) {
        event.start(builder, args);
    });
});

module.onUnload = () => {
    longToast(goodbyePrompt);
    config.setBoolean(hasShownWelcome, false, true);
}

module.onSnapMainActivityCreate = activity => {
    fetchAndShowNews(activity);
    checkForNewVersion();
    checkForNewMessages();
};