import { eq, sql } from "drizzle-orm";
import { db } from "../../../../../database/dbclient.js";
import { notifications } from "../../../../../database/schema/notifications.js";
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
import { createLog } from "../../../logger/logger.js";
import { query } from "../../../sqlServer/prodSqlServer.js";
import { sendEmail } from "../sendMail.js";
import { bow2incoming } from "../../../sqlServer/querys/notifications/bow2henkel.js";

const notification = async (notifyData: any) => {
    /**
     * Pass the entire notification over
     */
    createLog("debug", "reprinting", "notify", `monitoring ${notifyData.name}`);

    // validate if there are any emails.
    if (notifyData.emails === "") {
        createLog(
            "error",
            "reprinting",
            "notify",
            `There are no emails set for ${notifyData.name}`
        );
        return;
    }

    //let labels: Labels[];

    const { data: l, error: labelError } = await tryCatch(
        query(
            bow2incoming.replace(
                "[time]",
                notifyData.notifiySettings.processTime
            ),
            "Label Reprints"
        )
    );
    const labels: any = l?.data as any;
    if (labelError) {
        createLog(
            "error",
            "reprinting",
            "notify",
            `Failed to get the labels: ${labelError}`
        );
        return;
    }

    if (labels.length > 0) {
        //send the email :D
        const emailSetup = {
            email: notifyData.emails,
            subject: "Alert! New incoming goods has been received",
            template: "bow2IncomingGoods",
            context: {
                items: labels,
                time: notifyData.notifiySettings.processTime,
            },
        };

        const sentEmail = await sendEmail(emailSetup);

        if (!sentEmail.success) {
            createLog(
                "error",
                "reprinting",
                "notify",
                "Failed to send email, will try again on next interval"
            );
            return;
        }

        // // update the last time we ran and the prod id
        // const notifUpdate = {
        //     prodID: labels[0].IdEtikettenHistorie,
        //     lastRan: nowDate(),
        // };

        // update the last time ran

        const { data, error } = await tryCatch(
            db
                .update(notifications)
                .set({
                    lastRan: sql`NOW()`,
                    notifiySettings: {
                        ...notifyData.notifiySettings,
                        prodID: labels[0].IdEtikettenHistorie,
                    },
                })
                .where(eq(notifications.name, notifyData.name))
        );
    } else {
        return;
    }
};

export default notification;
