import { assert } from "../../assert.js";

/**
 * Picks element with highest score from the array using supplied scoring function.
 * If multiple elements with the same highest score exist, the result will be first such encountered element
 * @template T
 * @param {T[]} array
 * @param {function(el:T, index:number):number} scoreFunction
 * @returns {T|undefined}
 */
export function array_pick_best_element(array, scoreFunction) {
    assert.notEqual(array, undefined, 'array is undefined');
    assert.isFunction(scoreFunction, 'scoreFunction');

    let bestElement;
    let bestScore;

    const size = array.length;

    if (size === 0) {
        return undefined;
    }

    bestElement = array[0];

    bestScore = scoreFunction(bestElement, 0);

    assert.isNumber(bestScore, 'bestScore');

    for (let i = 1; i < size; i++) {
        const el = array[i];

        // compute score
        const score = scoreFunction(el, i);

        assert.isNumber(score, 'score');

        if (score > bestScore) {
            bestScore = score;
            bestElement = el;
        }
    }

    return bestElement;
}
