import * as XLSX from "xlsx";
import { runDatamartQuery } from "../datamart/datamart.controller.js";
import { returnFunc } from "../utils/returnHelper.utils.js";
import { tryCatch } from "../utils/trycatch.utils.js";
import { postData } from "./logistics.dm.postData.js";

export const energizerOrders = async (data: any, user: any) => {
	/**
	 * Standard orders meaning that we get the standard file exported and fill it out and uplaod to lst.
	 */

	/*
        get the order state.
        */

	const { data: o, error: oe } = await tryCatch(
		runDatamartQuery({ name: "orderState", options: {} }),
	);

	if (oe) {
		return returnFunc({
			success: false,
			level: "error",
			module: "logistics",
			subModule: "orders",
			message: `Error getting Article info`,
			data: [oe.message],
			notify: true,
		});
	}

	const openOrders: any = o?.data;

	/*
	get default invoice address
	*/
	const { data: invoice, error: ie } = await tryCatch(
		runDatamartQuery({ name: "invoiceAddress", options: {} }),
	);

	if (ie) {
		return returnFunc({
			success: false,
			level: "error",
			module: "logistics",
			subModule: "orders",
			message: `Error getting Article info`,
			data: [ie.message],
			notify: true,
		});
	}

	const i: any = invoice?.data;

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

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

	const sheetName = workbook.SheetNames[0] as string;
	const sheet = workbook.Sheets[sheetName] as any;

	// define custom headers
	const headers = [
		"ITEM",
		"PO",
		"ReleaseNo",
		"QTY",
		"DELDATE",
		"COMMENTS",
		"What changed",
		"CUSTOMERID",
		"Remark",
	];
	const orderData = XLSX.utils.sheet_to_json(sheet, {
		defval: "",
		header: headers,
		range: 1,
	});

	// the base of the import
	const predefinedObject = {
		receivingPlantId: process.env.PROD_PLANT_TOKEN ?? "test1",
		documentName: `OrdersFromLST-${new Date(Date.now()).toLocaleString(
			"en-US",
		)}`,
		sender: user.username || "lst-system",
		externalRefNo: `OrdersFromLST-${new Date(Date.now()).toLocaleString(
			"en-US",
		)}`,
		orders: [],
	};

	let newOrders: any = orderData;

	// for orders that are in od or managed by od we want to make sure we send out an email on this so we dont over right data that could be already planned with a carrier.
	const odOrders: any = [];
	const okToUpdateOrders: any = [];

	for (const order of openOrders) {
		if (order.AdditionalInformation1?.includes("od")) {
			odOrders.push(order);
		} else {
			okToUpdateOrders.push(order);
		}
	}

	if (odOrders.length > 0) {
		console.log("send email for od touched orders", odOrders);
	}

	if (okToUpdateOrders.length === 0) {
		return returnFunc({
			success: false,
			level: "error",
			module: "logistics",
			subModule: "orders",
			message: `All orders have been posted to od and releases will not be updated`,
			data: [],
			notify: false,
		});
	}

	// filter out the orders that have already been started just to reduce the risk of errors.
	newOrders.filter((oo: any) =>
		okToUpdateOrders.some(
			(o: any) => o.CustomerOrderNumber === oo.CustomerOrderNumber,
		),
	);

	// filter out the blanks
	newOrders = newOrders.filter((z: any) => z.ITEM !== "");

	// let postedOrders: any = [];
	// for (const [customerID, orders] of Object.entries(orderData)) {
	//     // console.log(`Running for Customer ID: ${customerID}`);
	//     const newOrders: any = orderData;

	//     // filter out the orders that have already been started just to reduce the risk of errors.
	//     newOrders.filter((oo: any) =>
	//         openOrders.some(
	//             (o: any) => o.CustomerOrderNumber === oo.CustomerOrderNumber
	//         )
	//     );

	//     // map everything out for each order
	const nOrder = newOrders.map((o: any) => {
		const invoice = i.filter(
			(i: any) => i.deliveryAddress === parseInt(o.CUSTOMERID),
		);
		if (!invoice) {
			return null;
		}
		return {
			customerId: parseInt(o.CUSTOMERID),
			invoiceAddressId: invoice[0].invoiceAddress, // matched to the default invoice address
			customerOrderNo: o.PO,
			orderDate: new Date(Date.now()).toLocaleString("en-US"),
			positions: [
				{
					deliveryAddressId: parseInt(o.CUSTOMERID),
					customerArticleNo: o.ITEM,
					quantity: parseInt(o.QTY),
					deliveryDate: o.DELDATE, //excelDateStuff(o.DELDATE),
					customerLineItemNo: o.ReleaseNo, // this is how it is currently sent over from abbott
					customerReleaseNo: o.ReleaseNo, // same as above
					remark: o.COMMENTS === "" ? null : o.COMMENTS,
				},
			],
		};
	});

	//     // do that fun combining thing
	const updatedPredefinedObject = {
		...predefinedObject,
		orders: [...predefinedObject.orders, ...nOrder],
	};

	//     //console.log(updatedPredefinedObject);

	//     // post the orders to the server
	const posting: any = await postData(
		{
			type: "orders",
			endpoint: "/public/v1.0/DemandManagement/ORDERS",
			data: updatedPredefinedObject as any,
		},
		user,
	);

	return {
		customer: nOrder[0].CUSTOMERID,
		//totalOrders: orders?.length(),
		success: posting.success,
		message: posting.message,
		data: posting.data,
	};
};
