import { useSelect } from '@wordpress/data';
import { BULK_LABELS_STORE_NAME } from 'data/constants';
import { toError, type BulkLabelsSelect } from './store';
import type { AutoAssignedPackagesMap } from './types';

interface UseAutoAssignedPackagesResult {
	isResolving: boolean;
	error: Error | null;
	results: AutoAssignedPackagesMap;
}

const EMPTY_RESULTS: AutoAssignedPackagesMap = {};

/**
 * Per-order box-packer suggestions for the given orders, backed by the
 * bulk-labels @wordpress/data store. The POST
 * /wcshipping/v1/label/auto-assign-packages call runs once per distinct
 * order-id set (resolver-cached); reopening the modal with the same
 * selection reuses the cached result.
 */
export const useAutoAssignedPackages = (
	orderIds: number[]
): UseAutoAssignedPackagesResult => {
	const idsKey = orderIds.join( ',' );

	return useSelect(
		( select ): UseAutoAssignedPackagesResult => {
			if ( orderIds.length === 0 ) {
				return {
					isResolving: false,
					error: null,
					results: EMPTY_RESULTS,
				};
			}
			const store = select(
				BULK_LABELS_STORE_NAME
			) as unknown as BulkLabelsSelect;
			const results = store.getAutoAssignedPackages( orderIds );
			const resolutionError = store.getResolutionError(
				'getAutoAssignedPackages',
				[ orderIds ]
			);
			return {
				results: results ?? EMPTY_RESULTS,
				isResolving: ! store.hasFinishedResolution(
					'getAutoAssignedPackages',
					[ orderIds ]
				),
				error: toError( resolutionError ),
			};
		},
		// eslint-disable-next-line react-hooks/exhaustive-deps -- idsKey covers orderIds contents
		[ idsKey ]
	);
};