import { executeQuery } from "~/lib/db";
import { responseMessage } from "~/lib/db";
import { queryStringBuilder } from "~/services/_main";

const itemType = "item";

async function getSize(itemID: string) {
	const blade = await executeQuery({
		query: `
		SELECT
			overallLength,
			bladeLength,
			handleLength,
			weightWithSaya,
			weightWithoutSaya,
			lockSize
		FROM
			jap_weap_swords
		WHERE
			itemID=${itemID}`,
	});

	return blade.length === 1
		? blade[0]
		: {
				overallLength: "",
				bladeLength: "",
				handleLength: "",
				weightWithSaya: "",
				weightWithoutSaya: "",
				lockSize: 0,
		  };
}

async function getBlade(itemID: string) {
	const blade = await executeQuery({
		query: `
		SELECT
			steelTypeID,
			temperID,
			bohiID,
			hamon,
			meiTypeID,
			meiLocationID,
			motohaba,
			sakihaba,
			motokasane,
			sakikasane,
			sori,
			kissaki,
			lockBlade
		FROM
			jap_weap_swords
		WHERE
			itemID=${itemID}`,
	});

	return blade.length === 1
		? blade[0]
		: {
				steelTypeID: 0,
				temperID: 0,
				bohiID: 0,
				hamon: "",
				meiTypeID: 0,
				meiLocationID: 0,
				motohaba: "",
				sakihaba: "",
				motokasane: "",
				sakikasane: "",
				sori: "",
				kissaki: "",
				lockBlade: 0,
		  };
}

async function getHandle(itemID: string) {
	const blade = await executeQuery({
		query: `
		SELECT
			itoWrapStyleID,
			itoColorID,
			itoTypeID,
			samegawaColorID,
			samegawaTypeID,
			lockHandle
		FROM
			jap_weap_swords
		WHERE
			itemID=${itemID}`,
	});

	return blade.length === 1
		? blade[0]
		: {
				itoWrapStyleID: 0,
				itoColorID: 0,
				itoTypeID: 0,
				samegawaColorID: 0,
				samegawaTypeID: 0,
				lockHandle: 0,
		  };
}

async function getFittings(itemID: string) {
	const blade = await executeQuery({
		query: `
		SELECT
			habakiID,
			seppaID,
			tsubaID,
			menukiID,
			fuchiID,
			kashiraID,
			lockFittings
		FROM
			jap_weap_swords
		WHERE
			itemID=${itemID}`,
	});

	return blade.length === 1
		? blade[0]
		: {
				habakiID: 0,
				seppaID: 0,
				tsubaID: 0,
				menukiID: 0,
				fuchiID: 0,
				kashiraID: 0,
				lockFittings: 0,
		  };
}

async function getSaya(itemID: string) {
	const blade = await executeQuery({
		query: `
		SELECT
			sayaColorID,
			sayaMaterialID,
			sayaFittingID,
			sageoColorID,
			sageoMaterialID,
			sageoUpgradedID,
			lockSaya
		FROM
			jap_weap_swords
		WHERE
			itemID=${itemID}`,
	});

	return blade.length === 1
		? blade[0]
		: {
				sayaColorID: 0,
				sayaMaterialID: 0,
				sayaFittingID: 0,
				sageoColorID: 0,
				sageoMaterialID: 0,
				sageoUpgradedID: 0,
				lockSaya: 0,
		  };
}

async function patch(itemID, item) {
	// console.log("SVC id:", id);
	// console.log("SVC item:", item);
	// console.log('item:', item.lockSize)

	// check for record
	const check = await executeQuery({
		query: `select japaneseSwordID from jap_weap_swords where itemID=${itemID}`,
	});

	// insert if missing
	if (check.length === 0) {
		await executeQuery({
			query: `insert into jap_weap_swords (itemID) values (${itemID})`,
		});
	}

	let sql = "update jap_weap_swords set updatedDate = CURRENT_TIMESTAMP";
	let result = "";

	// size
	sql = queryStringBuilder(sql, item, "lockSize");
	sql = queryStringBuilder(sql, item, "overallLength", "varchar");
	sql = queryStringBuilder(sql, item, "bladeLength", "varchar");
	sql = queryStringBuilder(sql, item, "handleLength", "varchar");
	sql = queryStringBuilder(sql, item, "weightWithSaya", "varchar");
	sql = queryStringBuilder(sql, item, "weightWithoutSaya", "varchar");

	// blade
	sql = queryStringBuilder(sql, item, "lockBlade");
	sql = queryStringBuilder(sql, item, "steelTypeID");
	sql = queryStringBuilder(sql, item, "temperID");
	sql = queryStringBuilder(sql, item, "bohiID");
	sql = queryStringBuilder(sql, item, "hamon", "varchar");
	sql = queryStringBuilder(sql, item, "meiTypeID");
	sql = queryStringBuilder(sql, item, "meiLocationID");
	sql = queryStringBuilder(sql, item, "motohaba", "varchar");
	sql = queryStringBuilder(sql, item, "motokasane", "varchar");
	sql = queryStringBuilder(sql, item, "sakihaba", "varchar");
	sql = queryStringBuilder(sql, item, "sakikasane", "varchar");
	sql = queryStringBuilder(sql, item, "sori", "varchar");
	sql = queryStringBuilder(sql, item, "kissaki", "varchar");

	// handle
	sql = queryStringBuilder(sql, item, "lockHandle");
	sql = queryStringBuilder(sql, item, "itoWrapStyleID");
	sql = queryStringBuilder(sql, item, "itoColorID");
	sql = queryStringBuilder(sql, item, "itoTypeID");
	sql = queryStringBuilder(sql, item, "samegawaColorID");
	sql = queryStringBuilder(sql, item, "samegawaTypeID");

	// fittings
	sql = queryStringBuilder(sql, item, "lockFittings");
	sql = queryStringBuilder(sql, item, "habakiID");
	sql = queryStringBuilder(sql, item, "seppaID");
	sql = queryStringBuilder(sql, item, "tsubaID");
	sql = queryStringBuilder(sql, item, "menukiID");
	sql = queryStringBuilder(sql, item, "fuchiID");
	sql = queryStringBuilder(sql, item, "kashiraID");

	// saya
	sql = queryStringBuilder(sql, item, "lockSaya");
	sql = queryStringBuilder(sql, item, "sayaColorID");
	sql = queryStringBuilder(sql, item, "sayaMaterialID");
	sql = queryStringBuilder(sql, item, "sayaFittingID");
	sql = queryStringBuilder(sql, item, "sageoColorID");
	sql = queryStringBuilder(sql, item, "sageoMaterialID");
	sql = queryStringBuilder(sql, item, "sageoUpgradedID");

	sql += ` where itemID = ${itemID}`;

	// console.log("sql>>", sql);

	if (sql.indexOf(",") > -1) {
		result = await executeQuery({ query: sql });
	} else {
		throw new Error(
			"No valid parameters found for patch > weapon > japanese > sword",
		);
	}

	return responseMessage("patch", itemType, result);
}

export default {
	getSize,
	getBlade,
	getHandle,
	getFittings,
	getSaya,
	patch,
};
