/**
 * External dependencies
 */
import { select, dispatch } from '@wordpress/data';
import { PlainPaymentMethods } from '@woocommerce/type-defs/payments';

/**
 * Internal dependencies
 */
import { STORE_KEY as PAYMENT_STORE_KEY } from './constants';

export const setDefaultPaymentMethod = async (
	paymentMethods: PlainPaymentMethods
) => {
	const paymentMethodKeys = Object.keys( paymentMethods );

	const expressPaymentMethodKeys = Object.keys(
		select( PAYMENT_STORE_KEY ).getAvailableExpressPaymentMethods()
	);

	const allPaymentMethodKeys = [
		...paymentMethodKeys,
		...expressPaymentMethodKeys,
	];

	const savedPaymentMethods =
		select( PAYMENT_STORE_KEY ).getSavedPaymentMethods();

	const savedPaymentMethod =
		Object.keys( savedPaymentMethods ).flatMap(
			( type ) => savedPaymentMethods[ type ]
		)[ 0 ] || undefined;

	if ( savedPaymentMethod ) {
		const token = savedPaymentMethod.tokenId.toString();
		const paymentMethodSlug = savedPaymentMethod.method.gateway;

		const savedTokenKey = `wc-${ paymentMethodSlug }-payment-token`;

		dispatch( PAYMENT_STORE_KEY ).__internalSetActivePaymentMethod(
			paymentMethodSlug,
			{
				token,
				payment_method: paymentMethodSlug,
				[ savedTokenKey ]: token,
				isSavedToken: true,
			}
		);
		return;
	}

	const activePaymentMethod =
		select( PAYMENT_STORE_KEY ).getActivePaymentMethod();

	// Return if current method is valid.
	if (
		activePaymentMethod &&
		allPaymentMethodKeys.includes( activePaymentMethod )
	) {
		return;
	}

	dispatch( PAYMENT_STORE_KEY ).__internalSetPaymentStatus( {
		isPristine: true,
	} );

	dispatch( PAYMENT_STORE_KEY ).__internalSetActivePaymentMethod(
		paymentMethodKeys[ 0 ]
	);
};
