import { executeQuery, responseMessage } from "~/lib/db";
import _ from "lodash";

import svcItems from "~/services/item/items";

const itemType = "itemBundle";

async function getBlank() {
	return {
		itemBundleID: 0,
		sourceID: 0,
		statusID: 0,
		shipping: null,
		shippingFree: 0,
		purchasedDate: null,
		purchasedDateNA: 0,
		shippedDate: null,
		shippedDateNA: 0,
		deliveredDate: null,
		deliveredDateNA: 0,
		isLocked: 0,
	};
}

async function get(itemBundleID) {
	const query = await executeQuery({
		query: `
			SELECT
				*
			FROM
				vw_itembundles
			WHERE
				itemBundleID = ${itemBundleID}
		`,
	});
	const itemsInBundle = await svcItems.getList(0); // items in all categories

	query[0].items = itemsInBundle.filter((x) => x.itemBundleID.toString() === itemBundleID.toString());

	return query[0];
}

async function create() {
	// TODO this is duplicated from itemBundles.js except with hardcoded structure
	const result = await executeQuery({
		query: `
			INSERT INTO item_bundles (
				sourceID,
				statusID,
				shipping,
				shippingFree,
				purchasedDate,
				purchasedDateNA,
				shippedDate,
				shippedDateNA,
				deliveredDate,
				deliveredDateNA,
				isLocked
			) VALUES (
				0,
				0,
				0,
				0,
				null,
				0,
				null,
				0,
				null,
				0,
				0
			)
		`,
	});

	return result.insertId;
}

async function update(bundle) {
	const result = await executeQuery({
		query: `UPDATE
			item_bundles
		SET
			sourceID=${bundle.sourceID},
			statusID=${bundle.statusID},
			shipping=${bundle.shipping},
			shippingFree=${bundle.shippingFree},
			purchasedDate=${bundle.purchasedDate},
			purchasedDateNA=${bundle.purchasedDateNA},
			shippedDate=${bundle.shippedDate},
			shippedDateNA=${bundle.shippedDateNA},
			deliveredDate=${bundle.deliveredDate},
			deliveredDateNA=${bundle.deliveredDateNA},
			isLockedGeneral=${bundle.isLockedGeneral}
			isLockedItem=${bundle.isLockedItem}
		WHERE
			itemBundleID=${bundle.itemBundleID}
		`,
	});

	return responseMessage("update", itemType, result);
}

async function patch(itemBundleID, bundle) {
	let sql = "update item_bundles set updatedDate=CURRENT_TIMESTAMP";
	let result = "";

	// common item fields
	if (_.has(bundle, "sourceID")) {
		sql += `, sourceID = ${bundle.sourceID}`;
	}
	if (_.has(bundle, "statusID")) {
		sql += `, statusID = ${bundle.statusID}`;
	}
	if (_.has(bundle, "shipping")) {
		sql += `, shipping = ${bundle.shipping}`;
	}
	if (_.has(bundle, "shippingFree")) {
		sql += `, shippingFree = ${bundle.statusID}`;
	}

	if (_.has(bundle, "purchasedDate")) {
		if (bundle.purchasedDate === null) {
			sql += `, purchasedDate = null`;
		} else {
			sql += `, purchasedDate = '${bundle.purchasedDate.substr(0, 10)}'`;
		}
	}
	if (_.has(bundle, "purchasedDateNA")) {
		sql += `, purchasedDateNA = ${bundle.purchasedDateNA}`;
	}

	if (_.has(bundle, "shippedDate")) {
		if (bundle.shippedDate === null) {
			sql += `, shippedDate = null`;
		} else {
			sql += `, shippedDate = '${bundle.shippedDate.substr(0, 10)}'`;
		}
	}
	if (_.has(bundle, "shippedDateNA")) {
		sql += `, shippedDateNA = ${bundle.shippedDateNA}`;
	}

	if (_.has(bundle, "deliveredDate")) {
		if (bundle.deliveredDate === null) {
			sql += `, deliveredDate = null`;
		} else {
			sql += `, deliveredDate = '${bundle.deliveredDate.substr(0, 10)}'`;
		}
	}
	if (_.has(bundle, "deliveredDateNA")) {
		sql += `, deliveredDateNA = ${bundle.deliveredDateNA}`;
	}

	sql += ` where itemBundleID = ${itemBundleID}`;

	console.log("ITEM BUNDLES PATCH SQL:\n", sql);

	if (sql !== null) {
		result = await executeQuery({ query: sql });
	} else {
		console.log("**************************************************");
		console.log("**************************************************");
		console.log("  UNABLE TO FIND A VALID PATCH METHOD  ");
		console.log("**************************************************");
		console.log("**************************************************");
		result = "No valid parameters found for patch > SERVICES > ITEMBUNDLE";
	}

	console.log("itembundle ", itemBundleID, "patched, clear the cache");
	// cache.del(`itemBundlesList`)

	return responseMessage("patch", itemType, result);
}

export default {
	getBlank,
	get,
	create,
	update,
	patch,
};
