import type { IExecuteFunctions } from 'n8n-core';

import type { IBinaryKeyData, IDataObject } from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow';

import { apiRequest } from '../../../transport';

export async function upload(this: IExecuteFunctions, index: number) {
	let body: IDataObject = {};
	const requestMethod = 'POST';

	const items = this.getInputData();

	const category = this.getNodeParameter('categoryId', index) as string;
	const share = this.getNodeParameter('options.share', index, true) as boolean;

	if (items[index].binary === undefined) {
		throw new NodeOperationError(this.getNode(), 'No binary data exists on item!', {
			itemIndex: index,
		});
	}

	const propertyNameUpload = this.getNodeParameter('binaryPropertyName', index);

	if (items[index]!.binary![propertyNameUpload] === undefined) {
		throw new NodeOperationError(
			this.getNode(),
			`No binary data property "${propertyNameUpload}" does not exists on item!`,
			{ itemIndex: index },
		);
	}

	const item = items[index].binary as IBinaryKeyData;

	const binaryData = item[propertyNameUpload];

	const binaryDataBuffer = await this.helpers.getBinaryDataBuffer(index, propertyNameUpload);

	body = {
		json: false,
		formData: {
			file: {
				value: binaryDataBuffer,
				options: {
					filename: binaryData.fileName,
					contentType: binaryData.mimeType,
				},
			},
			fileName: binaryData.fileName,
			category,
		},
		resolveWithFullResponse: true,
	};

	if (body.formData) {
		Object.assign(body.formData, share ? { share: 'yes' } : { share: 'no' });
	}

	//endpoint
	const endpoint = 'files';
	const { headers } = await apiRequest.call(this, requestMethod, endpoint, {}, {}, body);
	return this.helpers.returnJsonArray({ fileId: headers.location.split('/').pop() });
}
