const $ = window.jQuery;

export default class GPIConditionalLogicFormAdmin {
	constructor() {
		if (!window.GPI_ADMIN.conditionalLogicSupported) {
			return;
		}

		window.gform.addFilter(
			'gform_conditional_logic_fields',
			this.addConditionalLogicFields
		);
	}

	addConditionalLogicFields = (
		ruleFields: GravityFormsConditionalLogicRuleField[],
		form: GravityFormsForm,
		selectedFieldId: number
	) => {
		for (const field of form.fields) {
			const isCondLogicSupportedFieldType =
				$.inArray(window.GetInputType(field), ['multiselect']) === -1;

			if (field.gpiInventory && isCondLogicSupportedFieldType) {
				if (field.type !== 'checkbox') {
					this.addRuleFieldAfter(
						{
							label: 'Available | ' + field.label,
							value: 'gpi_available_' + field.id,
						},
						field.label,
						ruleFields
					);
				} else if (field.choices) {
					field.choices.forEach(
						(choice: { text: string }, index: number) => {
							this.addRuleFieldBefore(
								{
									label: `Available | ${field.label} (${choice.text})`,
									value: `gpi_available_${field.id}_${index}`,
								},
								field.label,
								ruleFields
							);
						}
					);
				}
			}
		}

		return ruleFields;
	};

	addRuleFieldAfter = function (
		ruleField: GravityFormsConditionalLogicRuleField,
		targetLabel: string,
		ruleFields: GravityFormsConditionalLogicRuleField[]
	) {
		let targetIndex: number = 0;

		$.each(
			ruleFields,
			// @ts-ignore
			(i: number, _ruleField: GravityFormsConditionalLogicRuleField) => {
				if (targetLabel === _ruleField.label) {
					targetIndex = i;
					return false;
				}
			}
		);

		ruleFields.splice(targetIndex + 1, 0, ruleField);

		return ruleFields;
	};

	addRuleFieldBefore = function (
		ruleField: GravityFormsConditionalLogicRuleField,
		targetLabel: string,
		ruleFields: GravityFormsConditionalLogicRuleField[]
	) {
		let targetIndex: number = 0;

		$.each(
			ruleFields,
			// @ts-ignore
			(i: number, _ruleField: GravityFormsConditionalLogicRuleField) => {
				if (targetLabel === _ruleField.label) {
					targetIndex = i;
					return false;
				}
			}
		);

		ruleFields.splice(targetIndex, 0, ruleField);

		return ruleFields;
	};
}
