/**
 * External dependencies
 */
import { getSetting } from '@woocommerce/settings';
import { recordEvent } from '@woocommerce/tracks';

/**
 * Internal dependencies
 */
import {
	CoreProfilerStateMachineContext,
	UserProfileEvent,
	BusinessInfoEvent,
	PluginsLearnMoreLinkClicked,
	PluginsInstallationCompletedWithErrorsEvent,
	PluginsInstallationCompletedEvent,
	PluginsInstallationRequestedEvent,
} from '..';
import { POSSIBLY_DEFAULT_STORE_NAMES } from '../pages/BusinessInfo';
import {
	InstalledPlugin,
	PluginInstallError,
} from '../services/installAndActivatePlugins';
import { getPluginTrackKey, getTimeFrame } from '~/utils';

const recordTracksStepViewed = (
	_context: unknown,
	_event: unknown,
	{ action }: { action: unknown }
) => {
	const { step } = action as { step: string };
	recordEvent( 'coreprofiler_step_view', {
		step,
		wc_version: getSetting( 'wcVersion' ),
	} );
};

const recordTracksStepSkipped = (
	_context: unknown,
	_event: unknown,
	{ action }: { action: unknown }
) => {
	const { step } = action as { step: string };
	recordEvent( `coreprofiler_${ step }_skip` );
};

const recordTracksIntroCompleted = () => {
	recordEvent( 'coreprofiler_step_complete', {
		step: 'intro_opt_in',
		wc_version: getSetting( 'wcVersion' ),
	} );
};

const recordTracksUserProfileCompleted = (
	_context: CoreProfilerStateMachineContext,
	event: Extract< UserProfileEvent, { type: 'USER_PROFILE_COMPLETED' } >
) => {
	recordEvent( 'coreprofiler_step_complete', {
		step: 'user_profile',
		wc_version: getSetting( 'wcVersion' ),
	} );

	recordEvent( 'coreprofiler_user_profile', {
		business_choice: event.payload.userProfile.businessChoice,
		selling_online_answer: event.payload.userProfile.sellingOnlineAnswer,
		selling_platforms: event.payload.userProfile.sellingPlatforms
			? event.payload.userProfile.sellingPlatforms.join()
			: null,
	} );
};

const recordTracksSkipBusinessLocationCompleted = () => {
	recordEvent( 'coreprofiler_step_complete', {
		step: 'skip_business_location',
		wc_version: getSetting( 'wcVersion' ),
	} );
};

const recordTracksIsEmailChanged = (
	context: CoreProfilerStateMachineContext,
	event: BusinessInfoEvent
) => {
	let emailSource, isEmailChanged;
	if ( context.onboardingProfile.store_email ) {
		emailSource = 'onboarding_profile_store_email'; // from previous entry
		isEmailChanged =
			event.payload.storeEmailAddress !==
			context.onboardingProfile.store_email;
	} else if ( context.currentUserEmail ) {
		emailSource = 'current_user_email'; // from currentUser
		isEmailChanged =
			event.payload.storeEmailAddress !== context.currentUserEmail;
	} else {
		emailSource = 'was_empty';
		isEmailChanged = event.payload.storeEmailAddress?.length > 0;
	}

	recordEvent( 'coreprofiler_email_marketing', {
		opt_in: event.payload.isOptInMarketing,
		email_field_prefilled_source: emailSource,
		email_field_modified: isEmailChanged,
	} );
};

const recordTracksBusinessInfoCompleted = (
	context: CoreProfilerStateMachineContext,
	event: Extract< BusinessInfoEvent, { type: 'BUSINESS_INFO_COMPLETED' } >
) => {
	recordEvent( 'coreprofiler_step_complete', {
		step: 'business_info',
		wc_version: getSetting( 'wcVersion' ),
	} );

	recordEvent( 'coreprofiler_business_info', {
		business_name_filled:
			POSSIBLY_DEFAULT_STORE_NAMES.findIndex(
				( name ) => name === event.payload.storeName
			) === -1,
		industry: event.payload.industry,
		store_location_previously_set:
			context.onboardingProfile.is_store_country_set || false,
		geolocation_success: context.geolocatedLocation !== undefined,
		geolocation_overruled: event.payload.geolocationOverruled,
	} );
};

const recordTracksPluginsInstallationRequest = (
	_context: CoreProfilerStateMachineContext,
	event: Extract<
		PluginsInstallationRequestedEvent,
		{ type: 'PLUGINS_INSTALLATION_REQUESTED' }
	>
) => {
	recordEvent( 'coreprofiler_store_extensions_continue', {
		shown: event.payload.pluginsShown || [],
		selected: event.payload.pluginsSelected || [],
		unselected: event.payload.pluginsUnselected || [],
	} );
};

const recordTracksPluginsLearnMoreLinkClicked = (
	_context: unknown,
	_event: PluginsLearnMoreLinkClicked,
	{ action }: { action: unknown }
) => {
	const { step } = action as { step: string };
	recordEvent( `coreprofiler_${ step }_learn_more_link_clicked`, {
		plugin: _event.payload.plugin,
		link: _event.payload.learnMoreLink,
	} );
};

const recordFailedPluginInstallations = (
	_context: unknown,
	_event: PluginsInstallationCompletedWithErrorsEvent
) => {
	const failedExtensions = _event.payload.errors.map(
		( error: PluginInstallError ) => getPluginTrackKey( error.plugin )
	);

	recordEvent( 'coreprofiler_store_extensions_installed_and_activated', {
		success: false,
		failed_extensions: failedExtensions,
	} );

	_event.payload.errors.forEach( ( error: PluginInstallError ) => {
		recordEvent( 'coreprofiler_store_extension_installed_and_activated', {
			success: false,
			extension: getPluginTrackKey( error.plugin ),
			error_message: error.error,
		} );
	} );
};

const recordSuccessfulPluginInstallation = (
	_context: unknown,
	_event: PluginsInstallationCompletedEvent
) => {
	const installationCompletedResult =
		_event.payload.installationCompletedResult;

	const trackData: {
		success: boolean;
		installed_extensions: string[];
		total_time: string;
		[ key: string ]: number | boolean | string | string[];
	} = {
		success: true,
		installed_extensions: installationCompletedResult.installedPlugins.map(
			( installedPlugin: InstalledPlugin ) =>
				getPluginTrackKey( installedPlugin.plugin )
		),
		total_time: getTimeFrame( installationCompletedResult.totalTime ),
	};

	for ( const installedPlugin of installationCompletedResult.installedPlugins ) {
		const pluginKey = getPluginTrackKey( installedPlugin.plugin );
		const installTime = getTimeFrame( installedPlugin.installTime );
		trackData[ 'install_time_' + pluginKey ] = installTime;

		recordEvent( 'coreprofiler_store_extension_installed_and_activated', {
			success: true,
			extension: pluginKey,
			install_time: installTime,
		} );
	}

	recordEvent(
		'coreprofiler_store_extensions_installed_and_activated',
		trackData
	);
};

export default {
	recordTracksStepViewed,
	recordTracksStepSkipped,
	recordTracksIntroCompleted,
	recordTracksUserProfileCompleted,
	recordTracksSkipBusinessLocationCompleted,
	recordTracksBusinessInfoCompleted,
	recordTracksPluginsLearnMoreLinkClicked,
	recordFailedPluginInstallations,
	recordSuccessfulPluginInstallation,
	recordTracksPluginsInstallationRequest,
	recordTracksIsEmailChanged,
};
