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

/**
 * @type {CanvasModelOptions<XrayOptions>}
 */
const combatXrayPenis = {
	name: "combatXrayPenis",
	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: {
		base: {
			srcfn(options) {
				const base = ["machine", "tentacle"].includes(options.penis.penetratedType) ? options.penis.base + "_tentacle" : options.penis.base;
				const baseSize = options.penis.size ? "_size" + options.penis.size : "";
				return `${options.src}${options.penis.penetrated}/${base}${baseSize}.png`;
			},
			showfn(options) {
				return options.penis.penetrated === "vaginal" ? !!options.showNpcVagina : !!options.showNpcArse;
			},
			animationfn(options) {
				return options.animKeyPenis;
			},
			filters: ["penisPenetrated"],
			z: CombatRenderer.indices.xrayBase,
		},
		playerPenis: {
			srcfn(options) {
				const playerPenis = options.penis.playerSprite;
				const size = options.penis.size ? "_size" + options.penis.size : "";
				return `${options.src}${options.penis.penetrated}/${playerPenis}${size}.png`;
			},
			showfn(options) {
				return !!options.showPcPenis;
			},
			animationfn(options) {
				return options.animKeyPenis;
			},
			filtersfn(options) {
				if (playerHasStrapon()) {
					return ["worn_under_lower_main"];
				}
				if (options.penis.type === "parasite") {
					return ["parasite"];
				}
				return ["body"];
			},
			z: CombatRenderer.indices.xrayPenetrator,
		},
		playerCum: {
			srcfn(options) {
				const size = options.penis.size ? "_size" + options.penis.size : "";
				const cumAmt = options.penis.penetrated === "vaginal" ? "_cum" + V.otherFilled : "_cum";
				return `${options.src}${options.penis.penetrated}/cum/${options.penis.base}${size}${cumAmt}.png`;
			},
			showfn(options) {
				return !!options.penis.showCum && V.otherFilled >= 1;
			},
			animationfn(options) {
				return options.animKeyPenis;
			},
			filters: [],
			z: CombatRenderer.indices.xrayCum,
		},
		playerEjac: {
			srcfn(options) {
				const cumSize = options.penis.size ? "_size" + options.penis.size + "_cumming" : "";
				return `${options.src}${options.penis.penetrated}/cum/${options.penis.base}${cumSize}.png`;
			},
			showfn(options) {
				return !!options.penis.showCum && !!options.penis.isCumActive;
			},
			animationfn(options) {
				return options.animKeyPenis;
			},
			filters: [],
			z: CombatRenderer.indices.xrayEjac,
		},
		playerCondom: {
			srcfn(options) {
				const conSize = "_size" + options.penis.size;
				return `${options.src}${options.penis.penetrated}/tentacle${conSize}.png`;
			},
			showfn(options) {
				return !!options.showPcPenis && !!options.penis.condom.worn;
			},
			animationfn(options) {
				return options.animKeyPenis;
			},
			alpha: 0.4,
			filters: ["playerCondom"],
			z: CombatRenderer.indices.xrayCondom,
		},
	},
};
Renderer.CanvasModels.combatXrayPenis = combatXrayPenis;