import {
	CreateSourceConnectionPayload,
	DeleteSourcePayload,
	IntegrationRecord,
	Integrations,
	ListSourcesPayload,
	SourcePlatforms,
	SubscribeSourceEventPayload,
} from '@buildable/types';
import {
	getIntegrationDefinitionId,
	makeHttpNetworkCall,
} from '@buildable/utils';

export const createSourceConnectionApi = <T extends SourcePlatforms>(
	headers: Record<string, string>,
	url: string,
	payload: CreateSourceConnectionPayload<T>
) => {
	const authFormData =
		payload.type === 'webhook' || payload.type === 'nodejs'
			? {
					name: payload.label,
			  }
			: {
					...payload.config,
					name: payload.label,
			  };

	const integrationDefinitionId = getIntegrationDefinitionId(
		payload.type,
		'source'
	);

	const finalPayload = {
		integrationDefinitionId,
		authFormData,
		type: payload.type,
		group: payload.group,
		name: payload.label,
		key: payload.key,
	};

	return makeHttpNetworkCall<IntegrationRecord>({
		method: 'POST',
		url,
		data: finalPayload,
		headers,
	});
};

export const deleteSourceConnectionApi = (
	headers: Record<string, string>,
	url: string,
	payload: DeleteSourcePayload
) => {
	return makeHttpNetworkCall({
		method: 'POST',
		url,
		data: payload,
		headers,
	});
};

export const subscribeEventsApi = async <T extends SourcePlatforms>(
	headers: Record<string, string>,
	url: string,
	payload: SubscribeSourceEventPayload<T>
) => {
	const { events, type, key } = payload;

	if (type === 'nodejs') {
		const eventList = events.join(',');
		return makeHttpNetworkCall({
			method: 'POST',
			url,
			data: {
				key,
				events: eventList,
			},
			headers,
		});
	}

	const result = makeHttpNetworkCall({
		method: 'POST',
		url,
		data: {
			events,
			key,
		},
		headers,
	});

	//TODO: Create a second function
	await new Promise((resolve) => setTimeout(resolve, 5000));

	return result;

};

export const listSourcesApi = (
	headers: Record<string, string>,
	url: string,
	payload: ListSourcesPayload
) => {
	return makeHttpNetworkCall<Integrations>({
		method: 'POST',
		url,
		data: {
			...payload,
			query: {
				...payload?.query,
				_id: {
					$regex: 'conn_src',
				},
			},
		},
		headers,
	});
};

