import express, { Request } from "express";
import { getLogin } from "../auth";
import { parseToken } from "../utils";
import { getNotificationSettings, saveNotificationSettings } from "../notifikace";
import { subscribePush, unsubscribePush, getVapidPublicKey } from "../pushReminder";
import { UpdateNotificationSettingsData } from "../../../types";

const router = express.Router();

/** Vrátí nastavení notifikací pro přihlášeného uživatele. */
router.get("/settings", async (req, res, next) => {
    const login = getLogin(parseToken(req));
    try {
        const settings = await getNotificationSettings(login);
        res.status(200).json(settings);
    } catch (e: any) { next(e) }
});

/** Uloží nastavení notifikací pro přihlášeného uživatele. */
router.post("/settings", async (req: Request<{}, any, UpdateNotificationSettingsData["body"]>, res, next) => {
    const login = getLogin(parseToken(req));
    try {
        const settings = await saveNotificationSettings(login, {
            ntfyTopic: req.body.ntfyTopic,
            discordWebhookUrl: req.body.discordWebhookUrl,
            teamsWebhookUrl: req.body.teamsWebhookUrl,
            enabledEvents: req.body.enabledEvents,
            reminderTime: req.body.reminderTime,
        });
        res.status(200).json(settings);
    } catch (e: any) { next(e) }
});

/** Vrátí veřejný VAPID klíč pro registraci push notifikací. */
router.get("/push/vapidKey", (req, res) => {
    const key = getVapidPublicKey();
    if (!key) {
        return res.status(503).json({ error: "Push notifikace nejsou nakonfigurovány" });
    }
    res.status(200).json({ key });
});

/** Přihlásí uživatele k push připomínkám. */
router.post("/push/subscribe", async (req, res, next) => {
    const login = getLogin(parseToken(req));
    try {
        if (!req.body.subscription) {
            return res.status(400).json({ error: "Nebyla předána push subscription" });
        }
        if (!req.body.reminderTime) {
            return res.status(400).json({ error: "Nebyl předán čas připomínky" });
        }
        await subscribePush(login, req.body.subscription, req.body.reminderTime);
        res.status(200).json({});
    } catch (e: any) { next(e) }
});

/** Odhlásí uživatele z push připomínek. */
router.post("/push/unsubscribe", async (req, res, next) => {
    const login = getLogin(parseToken(req));
    try {
        await unsubscribePush(login);
        res.status(200).json({});
    } catch (e: any) { next(e) }
});

export default router;
