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";

export interface Labels {
    IdEtikettenHistorie?: number;
}
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;
    }

    // well set a backup default time here
    let timeCheck = `DATEADD(SECOND, -30, getdate()) `;

    // set the time of getting the label
    if (notifyData.timeType === "sec") {
        timeCheck = `DATEADD(SECOND, -${notifyData.checkInterval}, getdate()) `;
    } else if (notifyData.timeType === "min") {
        timeCheck = `DATEADD(MINUTE, -${notifyData.checkInterval}, getdate()) `;
    }

    let reprintQuery = `
        SELECT  
        IdEtikettenHistorie,
        IdArtikelvarianten as av,
        ArtikelVariantenBez as alias,
        LfdNr as runningNumber,
        CONVERT(VARCHAR, CAST(Add_Date AS DATETIME), 100) Add_Date,
        Add_User,
        CONVERT(VARCHAR, CAST(Upd_Date AS DATETIME), 100) Upd_Date,
        Upd_User,
        EtikettenDruckerBezeichnung as printer,
        AnzahlGedruckterKopien as totalPrinted 
        FROM Alplaprod_test1.dbo.V_EtikettenGedruckt (nolock)
        where AnzahlGedruckterKopien > 2 
        and CONVERT(varchar(5), Add_Date,108) not like CONVERT(varchar(5), Upd_Date,108) 
        and Upd_Date > DATEADD(SECOND, -30, getdate()) 
        and VpkVorschriftBez not like '%$%'
        `;

    //update the time check

    reprintQuery = reprintQuery.replaceAll(
        "DATEADD(SECOND, -30, getdate()) ",
        timeCheck
    );

    //let labels: Labels[];

    const { data: l, error: labelError } = await tryCatch(
        query(reprintQuery, "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! Label Reprinted",
            template: "reprintLabels",
            context: {
                items: labels,
            },
        };

        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;
