/**
 * Client-side sort and pagination for admin lists.
 *
 * @package
 */

export type SortDir = 'asc' | 'desc';

export function compareSortValues(
	a: string | number,
	b: string | number,
	dir: SortDir
): number {
	const mul = dir === 'asc' ? 1 : -1;
	if ( typeof a === 'number' && typeof b === 'number' ) {
		if ( a === b ) {
			return 0;
		}
		return ( a < b ? -1 : 1 ) * mul;
	}
	return (
		String( a ).localeCompare( String( b ), 'en-GB', {
			numeric: true,
			sensitivity: 'base',
		} ) * mul
	);
}

export function sortRows< T >(
	rows: readonly T[],
	getValue: ( row: T ) => string | number,
	dir: SortDir
): T[] {
	return [ ...rows ].sort( ( x, y ) =>
		compareSortValues( getValue( x ), getValue( y ), dir )
	);
}

export function paginate< T >(
	rows: readonly T[],
	page: number,
	pageSize: number
): {
	readonly items: T[];
	readonly page: number;
	readonly pages: number;
	readonly total: number;
	readonly from: number;
	readonly to: number;
} {
	const size = Math.max( 1, pageSize );
	const total = rows.length;
	const pages = Math.max( 1, Math.ceil( total / size ) );
	const safePage = Math.min( Math.max( 1, page ), pages );
	const start = ( safePage - 1 ) * size;
	const items = rows.slice( start, start + size );
	return {
		items,
		page: safePage,
		pages,
		total,
		from: total === 0 ? 0 : start + 1,
		to: start + items.length,
	};
}
