// @ts-check
/* globals CombatRenderer, XrayCombatMapper, XrayOptions, CanvasModelLayers */

/**
 * @type {CanvasModelOptions<XrayOptions>}
 */
const combatXrayArse = {
	name: "combatXrayArse",
	width: 256,
	height: 120,
	scale: true,
	frames: 8,
	generatedOptions() {
		return [];
	},
	defaultOptions() {
		return { ...XrayCombatMapper.generateOptions(), ...this.metadata };
	},
	preprocess(options) {
		XrayCombatMapper.mapXrayOptions(options);
		if (V.debug) {
			// Save options for easy lookup
			CombatRenderer.options[this.name] = options;
		}
	},
	layers: {
		arse: {
			srcfn(options) {
				const baseSize = options.anus.size ? "_size" + options.anus.size : "";
				const baseSizeDP = options.anus.doublePen ? "_dp" + options.anus.size2 : "";
				return `${options.src}anal/${options.anus.base}${baseSize}${baseSizeDP}.png`;
			},
			showfn(options) {
				return !!options.showPcArse;
			},
			animationfn(options) {
				return options.animKeyArse;
			},
			filters: [],
			z: CombatRenderer.indices.xrayBase,
		},
		penetrator: xrayArsePenetrator("npc"),
		penetrator2: xrayArsePenetrator("npc2"),
		condom: xrayArseCondom("npc"),
		condom2: xrayArseCondom("npc2"),
		cum: {
			srcfn(options) {
				const baseSize = options.anus.size ? "_size" + options.anus.size : "";
				const cumAmt = options.anus.penetratorSprite.includes("horse") ? "_cum_horse" : "_cum";
				return `${options.src}anal/cum/${options.anus.base}${baseSize}${cumAmt}.png`;
			},
			showfn(options) {
				return !!options.anus.showCum && !!options.anus.show && options.anus.base !== "knotting";
			},
			animationfn(options) {
				return options.animKeyArse;
			},
			filters: [],
			z: CombatRenderer.indices.xrayCum,
		},
		ejaculating: {
			srcfn(options) {
				const cumSize = options.anus.size ? "_size" + options.anus.size + "_cumming" : "";
				return `${options.src}anal/cum/${options.anus.base}${cumSize}.png`;
			},
			showfn(options) {
				return !!options.anus.showCum && !!options.anus.isCumActive;
			},
			animationfn(options) {
				return options.animKeyArse;
			},
			filters: [],
			z: CombatRenderer.indices.xrayEjac,
		},
	},
};

/**
 * @param {string} npc
 * @param {CanvasModelLayers<XrayOptions>} overrideOptions
 * @returns {CanvasModelLayers<XrayOptions>}
 */
function xrayArsePenetrator(npc, overrideOptions = {}) {
	/**
	 * @type {CanvasModelLayers<XrayOptions>}
	 */
	const defaults = {
		srcfn(options) {
			const penSize = "_size" + options.anus.size;
			const dp = options.anus.doublePen && npc === "npc2" ? "_dp" : "";
			return `${options.src}anal/${options.anus.penetratorSprite}${penSize}${dp}.png`;
		},
		showfn(options) {
			return !!options.showNpcPenis && !!options.anus.show && options.anus[npc] !== undefined;
		},
		animationfn(options) {
			return options.animKeyArse;
		},
		filters: npc === "npc2" ? ["anusPenetrator2"] : ["anusPenetrator"],
		desaturatefn(options) {
			return !!options.anus[npc + "Strapon"];
		},
		brightnessfn(options) {
			return options.anus[npc + "Strapon"] ? -0.25 : 0;
		},
		z: npc === "npc2" ? CombatRenderer.indices.xrayPenetrator2 : CombatRenderer.indices.xrayPenetrator,
	};
	return Object.assign(defaults, overrideOptions);
}

/**
 * @param {string} npc
 * @param {CanvasModelLayers<XrayOptions>} overrideOptions
 * @returns {CanvasModelLayers<XrayOptions>}
 */
function xrayArseCondom(npc, overrideOptions = {}) {
	/**
	 * @type {CanvasModelLayers<XrayOptions>}
	 */
	const defaults = {
		srcfn(options) {
			const conSize = "_size" + options.anus.size;
			const dp = options.anus.doublePen && npc === "npc2" ? "_dp" : "";
			return `${options.src}anal/tentacle${conSize}${dp}.png`;
		},
		showfn(options) {
			const target = npc === "npc2" ? V.anusdoubletarget : V.anustarget;
			return !!options.showNpcPenis && !!options.anus.show && options.anus[npc] !== undefined && !!V.NPCList[target].condom.worn;
		},
		animationfn(options) {
			return options.animKeyArse;
		},
		alpha: 0.4,
		filters: npc === "npc2" ? ["anusCondom2"] : ["anusCondom"],
		z: npc === "npc2" ? CombatRenderer.indices.xrayCondom2 : CombatRenderer.indices.xrayCondom,
	};
	return Object.assign(defaults, overrideOptions);
}
Renderer.CanvasModels.combatXrayArse = combatXrayArse;