import {
	INodeType,
	INodeTypeDescription,
	IExecuteFunctions,
	INodeExecutionData,
	NodeConnectionType,
} from 'n8n-workflow';

export class _ScriptFilter implements INodeType {
	description: INodeTypeDescription = {
		displayName: 'ScriptFilter',
		name: 'scriptFilter',
		group: ['transform'],
		version: 1,
		description: 'Выполняет скрипт на JavaScript над item',
		defaults: {
			name: 'ScriptFilter',
		},
		inputs: [NodeConnectionType.Main],
		outputs: [NodeConnectionType.Main],
		properties: [
			{
				displayName: 'Код скрипта',
				name: 'code',
				type: 'string',
				typeOptions: {
					rows: 30,
				},
				default: 'obj = item.json;\nreturn obj;',
				description: 'JavaScript-код, который будет выполнен над элементом',
			},
		],
	};

	async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
		const item = this.getInputData()[0]; // берём один элемент
		const code = this.getNodeParameter('code', 0) as string;

		// Создаем функцию вида: function(item) { ...код... }
		const userFunction = new Function('item', code);

		// Формируем METADATA заново
		const nodeInfo = this.getNode();
		const workflowName = this.getWorkflow().name;

		item.json.METADATA = {
			from: nodeInfo.name,      // текущий узел
			id: nodeInfo.name,        // идентификатор узла
			workflow: workflowName,   // имя workflow
			time: Date.now(),
		};

		let outputData: INodeExecutionData;

		try {
			const output = userFunction.call(null, item);
			outputData = {
				json: output.json ?? output,
				binary: output.binary ?? undefined,
			};
		} catch (error) {
			throw new Error(`Ошибка выполнения скрипта: ${(error as Error).message}`);
		}

		return [[outputData]];
	}
}
