import {
	OptionsWithUri,
} from 'request';

import {
	IExecuteFunctions,
	IHookFunctions,
	ILoadOptionsFunctions,
} from 'n8n-core';

import {
	IDataObject, NodeApiError,
} from 'n8n-workflow';

export async function todoistApiRequest(
	this:
		| IHookFunctions
		| IExecuteFunctions
		| ILoadOptionsFunctions,
	method: string,
	resource: string,
	body: any = {}, // tslint:disable-line:no-any
	qs: IDataObject = {},
): Promise<any> { // tslint:disable-line:no-any
	const authentication = this.getNodeParameter('authentication', 0, 'apiKey');

	const endpoint = 'api.todoist.com/rest/v1';

	const options: OptionsWithUri = {
		headers: {},
		method,
		qs,
		uri: `https://${endpoint}${resource}`,
		json: true,
	};

	if (Object.keys(body).length !== 0) {
		options.body = body;
	}

	try {
		if (authentication === 'apiKey') {
			const credentials = this.getCredentials('todoistApi') as IDataObject;

			//@ts-ignore
			options.headers['Authorization'] = `Bearer ${credentials.apiKey}`;

			return this.helpers.request!(options);
		} else {
			//@ts-ignore
			return await this.helpers.requestOAuth2.call(this, 'todoistOAuth2Api', options);
		}

	} catch (error) {
		throw new NodeApiError(this.getNode(), error);
	}
}