import { format } from "date-fns";
import { eq, sql } from "drizzle-orm";
import { success } from "zod/v4";
import { db } from "../../../../database/dbclient.js";
import { invHistoricalData } from "../../../../database/schema/historicalINV.js";
import { settings } from "../../../../database/schema/settings.js";
import { tryCatch } from "../../../globalUtils/tryCatch.js";
import { createLog } from "../../logger/logger.js";
import { serverSettings } from "../../server/controller/settings/getSettings.js";
import { query } from "../../sqlServer/prodSqlServer.js";
import { activeArticle } from "../../sqlServer/querys/dataMart/article.js";
import { missingHistInv } from "../../sqlServer/querys/eom/missingHistInv.js";

const missingHistoricalData = async (date: string) => {
	const plantToken = serverSettings.filter((n) => n.name === "plantToken");
	const { data: inv, error: invError } = (await tryCatch(
		query(
			missingHistInv.replace("[eomHistDate]", date),
			"eom missing historical data",
		),
	)) as any;

	if (invError) {
		createLog("error", "eom", "eom", `There was an error getting the sql data`);
		return;
	}

	const { data: articles, error: avError } = (await tryCatch(
		query(activeArticle, "Get active articles"),
	)) as any;

	const av = articles.data.length > 0 ? articles.data : ([] as any);

	const importInv = inv.data ? inv.data : [];

	const remap = importInv.map((i: any) => {
		return {
			//histDate: sql`(NOW() - INTERVAL '1 day')::date`,
			histDate: date,
			plantToken: plantToken[0].value,
			article: i.article,
			articleDescription: i.articleDescription,
			materialType:
				av.filter((a: any) => a.IdArtikelvarianten === i.article).length > 0
					? av.filter((a: any) => a.IdArtikelvarianten === i.article)[0]
							?.TypeOfMaterial
					: "Item not defined",
			total_QTY: i.total_QTY,
			avaliable_QTY: 0,
			coa_QTY: 0,
			held_QTY: 0,
			consignment: 0,
			lot_Number: 0,
		};
	});

	const { data: dataImport, error: errorImport } = await tryCatch(
		db.insert(invHistoricalData).values(remap),
	);

	if (errorImport) {
		console.log(errorImport);
		createLog(
			"error",
			"eom",
			"eom",
			`There was an error importing all the inventory data.`,
		);
		return [];
	}

	if (dataImport) {
		createLog("info", "eom", "eom", `All data was imported successfully.`);

		return remap;
	}
};

function parseFlexibleDate(date: string): Date {
	const parts = date.replace(/[-.]/g, "/").split("/");
	if (parts.length !== 3) throw new Error("Invalid date format");

	let year: number, month: number, day: number;

	// find which index looks like a year
	if (parts[0].length === 4) {
		// yyyy/mm/dd
		year = +parts[0];
		month = +parts[1];
		day = +parts[2];
	} else if (parts[2].length === 4) {
		// mm/dd/yyyy
		year = +parts[2];
		month = +parts[0];
		day = +parts[1];
	} else {
		throw new Error("Cannot determine year position");
	}

	return new Date(year, month - 1, day);
}

export const historicalInvByDate = async (
	date: string,
	includePlantToken: boolean = false,
) => {
	console.log(date);
	// date format should always be yyyy-MM-dd or yyyy-MM-dd
	// let splitDate: string[];
	// if (date.includes("/")) {
	// 	splitDate = date.split("/");
	// } else if (date.includes("-")) {
	// 	splitDate = date.split("-");
	// } else {
	// 	return {
	// 		success: false,
	// 		message: "An invalid date was passed over",
	// 		data: [],
	// 	};
	// }

	// const year = parseInt(splitDate[0], 10);
	// const month = parseInt(splitDate[1], 10) - 1; // zero-based months
	// const day = parseInt(splitDate[2], 10);
	//const histDate = new Date(year, month, day);
	console.log(parseFlexibleDate(date));
	console.log(format(parseFlexibleDate(date), "yyyy-MM-dd"));
	const { data, error } = (await tryCatch(
		db
			.select()
			.from(invHistoricalData)
			.where(
				eq(
					invHistoricalData.histDate,
					format(parseFlexibleDate(date), "yyyy-MM-dd"),
				),
			),
	)) as any;

	if (error) {
		return {
			success: false,
			message: "There was an error with getting the inventory",
			data: error,
		};
	}

	if (includePlantToken) {
		const { data: s, error: se } = (await tryCatch(
			db.select().from(settings).where(eq(settings.name, "plantToken")),
		)) as any;

		if (se) {
			console.log("Error getting articles");
			return data;
		}

		if (data.length === 0) {
			// pass over the old lame

			return {
				success: true,
				message: `Historical inventory is missing for ${date}`,
				data: await missingHistoricalData(date),
			};
		}
		return {
			success: true,
			message: `Historical inventory for ${date}`,
			data: data.map((n: any) => {
				return { plantToken: s[0].value, ...n };
			}),
		};
	} else {
		if (data.length === 0) {
			// pass over the old lame
			//const oldData = missingHistoricalData(date)
			return {
				success: true,
				message: `Historical inventory is missing for ${date}`,
				data: await missingHistoricalData(date),
			};
		}
		return {
			success: true,
			message: `Historical inventory for ${date}`,
			data: data,
		};
	}
};
