import { db } from "../../../../../../../database/dbclient.js";
import { settings } from "../../../../../../../database/schema/settings.js";
import { tryCatch } from "../../../../../../globalUtils/tryCatch.js";
import XLSX from "xlsx";
import { postForecast } from "../postForecast.js";
import { query } from "../../../../../sqlServer/prodSqlServer.js";
import { activeArticle } from "../../../../../sqlServer/querys/dataMart/article.js";
import { addDays } from "date-fns";
import { sendEmail } from "../../../../../notifications/controller/sendMail.js";
import { createLog } from "../../../../../logger/logger.js";

export const energizerForecast = async (data: any, user: any) => {
    /**
     * Post a standard forecast based on the standard template.
     */

    const { data: s, error: e } = await tryCatch(db.select().from(settings));

    if (e) {
        return {
            success: false,
            message: `Error getting settings`,
            data: e,
        };
    }

    const plantToken = s.filter((s) => s.name === "plantToken");

    const arrayBuffer = await data.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);

    const workbook = XLSX.read(buffer, { type: "buffer" });

    const sheet: any = workbook.Sheets["Sheet1"];
    const range = XLSX.utils.decode_range(sheet["!ref"]);

    const headers = [
        "CustomerArticleNumber",
        "Quantity",
        "RequirementDate",
        "CustomerID",
    ];

    // formatting the data
    const rows = XLSX.utils.sheet_to_json(sheet, { header: 1 }) as any;

    const posting: any = [];
    const customerId = 44;

    for (let i = 1; i < rows.length; i++) {
        const row: any = rows[i];
        const material = row[0];

        if (material == undefined) continue;
        for (let j = 1; j < row.length; j++) {
            const qty = row[j];

            if (qty && qty !== 0) {
                const requirementDate = rows[0][j]; // first row is dates

                posting.push({
                    customerArticleNo: material,
                    quantity: qty,
                    requirementDate: new Date(requirementDate),
                });
            }
        }
    }

    // the predefined data that will never change
    const predefinedObject = {
        receivingPlantId: plantToken[0].value,
        documentName: `ForecastFromLST-${new Date(Date.now()).toLocaleString(
            "en-US"
        )}`,
        sender: user.username || "lst-system",
        customerId: customerId,
        positions: [],
    };

    // add the new forecast to the predefined data
    let updatedPredefinedObject = {
        ...predefinedObject,
        positions: [...predefinedObject.positions, ...posting],
    };

    //post it
    const forecastData: any = await postForecast(updatedPredefinedObject, user);

    return {
        success: forecastData.success,
        message: forecastData.message,
        data: forecastData.data,
    };
};
