/*
 * SPDX-License-Identifier: MPL-2.0
 *   Copyright (c) 2022 Philipp Le <philipp@philipple.de>.
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
 */

import nodemailer = require("nodemailer");

import { username, story_config } from "./config";
import {Client, StoryCollection, Sleeper} from "./utils"

async function send_email_report(stories: StoryCollection) {
    if ((stories.length() > 0) && (story_config.email)) {
        const smtp = nodemailer.createTransport({
            host: story_config.email.smtp.host,
            port: story_config.email.smtp.port,
            auth: {
                user: story_config.email.smtp.user,
                pass: story_config.email.smtp.password
            },
            requireTLS: story_config.email.smtp.starttls
        });
        let body = "IG Stories have been downloaded\n\nDetails:\n";
        stories.users.forEach((stories, user) => {
            if (stories.length > 0) {
                body += `    Fetched ${stories.length} items for ${user}`
            }
        });
        await smtp.sendMail({
            from: story_config.email.from,
            to: story_config.email.to,
            subject: story_config.email.subject,
            text: body
        });
        smtp.close();
    }
}

const client = new Client();
(async () => {
    await client.login(username);
    try {
        const sleeper = new Sleeper();

        let running = true;
        process.on("SIGINT", (code) => {
            running = false;
            sleeper.cancel();
        });

        while (running) {
            const stories = await client.get_stories(story_config.users);
            await stories.download(story_config.destination);
            await send_email_report(stories);
            await sleeper.sleep_ms(story_config.sleep_sec * 1000);
        }
    } finally {
        await client.logout();
    }
})();
