/**
 * External dependencies
 */
import '@wordpress/notices';
import { useSelect } from '@wordpress/data';
import { useCallback, useEffect, useState } from '@wordpress/element';
import { recordEvent } from '@woocommerce/tracks';

/**
 * Internal dependencies
 */
import SyncState from './sections/SyncState';
import AdCreditsNotice from './sections/AdCreditsNotice';
import SyncIssues from './sections/SyncIssues';
import HealthCheck from '../setup-guide/app/components/HealthCheck';
import CapiEnablementModal from '../setup-guide/app/components/CapiEnablementModal';
import {
	useCreateNotice,
	useDismissAdsModalDispatch,
	useDismissCapiModalDispatch,
} from './helpers/effects';
import NavigationClassic from '../components/navigation-classic';
import OnboardingModals from './components/OnboardingModals';
import { USER_INTERACTION_STORE_NAME } from './data';
import { useSettingsSelect } from '../setup-guide/app/helpers/effects';

/**
 * Opening a modal.
 *
 * @event wcadmin_pfw_modal_open
 * @property {string} name Ads Onboarding Modal.
 * @property {string} context catalog-sync
 */
/**
 * Closing a modal.
 *
 * @event wcadmin_pfw_modal_closed
 * @property {string} name Ads Onboarding Modal.
 * @property {string} context catalog-sync
 */

/**
 * Catalog Sync Tab.
 *
 * @fires wcadmin_pfw_modal_open with `{ name: 'ads-credits-onboarding' }`
 * @fires wcadmin_pfw_modal_close with `{ name: 'ads-credits-onboarding' }`
 *
 * @return {JSX.Element} rendered component
 */
const CatalogSyncApp = () => {
	const appSettings = useSettingsSelect();
	const adsCampaignIsActive = appSettings?.ads_campaign_is_active;

	const couponRedeemErrorID =
		appSettings?.account_data?.coupon_redeem_info?.error_id;

	useCreateNotice( wcSettings.pinterest_for_woocommerce.error );
	const [ isOnboardingModalOpen, setIsOnboardingModalOpen ] =
		useState( false );
	const [ isAdCreditsNoticeOpen, setIsAdCreditsNoticeOpen ] =
		useState( false );
	const [ isCapiModalOpen, setIsCapiModalOpen ] = useState( false );

	const userInteractions = useSelect( ( select ) =>
		select( USER_INTERACTION_STORE_NAME ).getUserInteractions()
	);

	const userInteractionsLoaded = useSelect( ( select ) =>
		select( USER_INTERACTION_STORE_NAME ).areInteractionsLoaded()
	);

	const openOnboardingModal = useCallback( () => {
		if (
			userInteractionsLoaded === false ||
			userInteractions?.ads_modal_dismissed
		) {
			return;
		}

		setIsOnboardingModalOpen( true );
		recordEvent( 'pfw_modal_open', {
			context: 'catalog-sync',
			name: 'ads-credits-onboarding',
		} );
	}, [ userInteractions?.ads_modal_dismissed, userInteractionsLoaded ] );

	const openAdsCreditsNotice = useCallback( () => {
		if (
			userInteractionsLoaded === false ||
			userInteractions?.ads_notice_dismissed
		) {
			return;
		}

		if (
			couponRedeemErrorID !== undefined &&
			couponRedeemErrorID !== 2322
		) {
			return;
		}

		setIsAdCreditsNoticeOpen( true );
	}, [
		userInteractions?.ads_notice_dismissed,
		userInteractionsLoaded,
		couponRedeemErrorID,
	] );

	const openCapiModal = useCallback( () => {
		if (
			userInteractionsLoaded === false ||
			userInteractions?.capi_modal_dismissed
		) {
			return;
		}

		const trackConversions = appSettings?.track_conversions;
		const trackConversionsCapi = appSettings?.track_conversions_capi;

		// Only show if track_conversions is enabled but CAPI is not enabled
		if ( ! trackConversions || trackConversionsCapi ) {
			return;
		}

		setIsCapiModalOpen( true );
	}, [
		userInteractionsLoaded,
		userInteractions?.capi_modal_dismissed,
		appSettings?.track_conversions,
		appSettings?.track_conversions_capi,
	] );

	const closeOnboardingModal = () => {
		setIsOnboardingModalOpen( false );
		handleSetDismissAdsModal();
		recordEvent( 'pfw_modal_closed', {
			context: 'catalog-sync',
			name: 'ads-credits-onboarding',
		} );
	};

	const setDismissCapiModal = useDismissCapiModalDispatch();
	const handleSetDismissCapiModal = useCallback( async () => {
		try {
			await setDismissCapiModal();
		} catch ( error ) {}
	}, [ setDismissCapiModal ] );

	const setDismissAdsModal = useDismissAdsModalDispatch();
	const handleSetDismissAdsModal = useCallback( async () => {
		try {
			await setDismissAdsModal();
		} catch ( error ) {}
	}, [ setDismissAdsModal ] );

	useEffect( () => {
		openOnboardingModal();
		openAdsCreditsNotice();
		openCapiModal();
	}, [ openOnboardingModal, openAdsCreditsNotice, openCapiModal ] );

	return (
		<div className="pinterest-for-woocommerce-catalog-sync">
			<HealthCheck />
			<NavigationClassic />

			<div className="pinterest-for-woocommerce-catalog-sync__container">
				<SyncState />
				{ isAdCreditsNoticeOpen && adsCampaignIsActive && (
					<AdCreditsNotice />
				) }
				<SyncIssues />
			</div>
			{ isOnboardingModalOpen && (
				<OnboardingModals onCloseModal={ closeOnboardingModal } />
			) }
			{ isCapiModalOpen && (
				<CapiEnablementModal
					onCloseModal={ () => setIsCapiModalOpen( false ) }
					onDismiss={ handleSetDismissCapiModal }
				/>
			) }
		</div>
	);
};

export default CatalogSyncApp;