import {
	IntegrationRecord,
	DestinationPlatforms,
	CreateDestinationConnectionPayload,
	DeleteDestinationPayload,
	ListDestinationsPayload,
	Integrations,
	WEBHOOK,
} from '@event-inc/types';
import { makeHttpNetworkCall, checkIfKeyOrIdExists } from '@event-inc/utils';
import { getIntegrationDefinitionId } from '@event-inc/utils';
import { version1 } from './configs.apis';

export const createDestinationConnectionApi = <T extends DestinationPlatforms>(
	headers: Record<string, string>,
	url: string,
	payload: CreateDestinationConnectionPayload<T>
) => {
	const integrationDefinitionId = getIntegrationDefinitionId(
		payload.type,
		'destination'
	);
	const authData = {
		name: payload.label,
		...payload.config,
	};

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

	if (payload.type === 'webhook') {
		const webhookAuthFormData = finalPayload?.authFormData as WEBHOOK;
		const webhookHeaders = webhookAuthFormData?.WEBHOOK_HEADERS || {
			'Content-Type': 'application/json',
		};

		finalPayload.authFormData = {
			...finalPayload.authFormData,
			WEBHOOK_HEADERS: JSON.stringify(webhookHeaders),
		};
	}

	return makeHttpNetworkCall<IntegrationRecord>({
		method: 'POST',
		url: `${url}/${version1}/integrations/create`,
		data: finalPayload,
		headers,
	});
};

export const deleteDestinationConnectionApi = (
	headers: Record<string, string>,
	url: string,
	payload: DeleteDestinationPayload
) => {
	const { id, key } = payload;

	checkIfKeyOrIdExists(
		id,
		key,
		'Must provide either id or key to delete a destination'
	);

	return makeHttpNetworkCall({
		method: 'POST',
		url: `${url}/${version1}/integrations/delete`,
		data: {
			integrationId: id,
			key,
		},
		headers,
	});
};

export const listDestinationsApi = (
	headers: Record<string, string>,
	url: string,
	payload: ListDestinationsPayload
) => {
	return makeHttpNetworkCall<Integrations>({
		method: 'POST',
		url: `${url}/${version1}/integrations/list`,
		data: {
			...payload,
			query: {
				...payload?.query,
				_id: {
					$regex: 'conn_dst',
				},
			},
		},
		headers,
	});
};

