import { filterProps, createError } from '../utils';
const LIST_FORMAT_OPTIONS = [
    'localeMatcher',
    'type',
    'style',
];
const now = Date.now();
function generateToken(i) {
    return `${now}_${i}_${now}`;
}
export function formatList({ locale, onError }, getListFormat, values, options = {}) {
    const ListFormat = Intl.ListFormat;
    if (!ListFormat) {
        onError(createError(`Intl.ListFormat is not available in this environment.
Try polyfilling it using "@formatjs/intl-listformat"
`));
    }
    const filteredOptions = filterProps(options, LIST_FORMAT_OPTIONS);
    try {
        const richValues = {};
        const serializedValues = values.map((v, i) => {
            if (typeof v === 'object') {
                const id = generateToken(i);
                richValues[id] = v;
                return id;
            }
            return String(v);
        });
        if (!Object.keys(richValues).length) {
            return getListFormat(locale, filteredOptions).format(serializedValues);
        }
        const parts = getListFormat(locale, filteredOptions).formatToParts(serializedValues);
        return parts.reduce((all, el) => {
            const val = el.value;
            if (richValues[val]) {
                all.push(richValues[val]);
            }
            else if (typeof all[all.length - 1] === 'string') {
                all[all.length - 1] += val;
            }
            else {
                all.push(val);
            }
            return all;
        }, []);
    }
    catch (e) {
        onError(createError('Error formatting list.', e));
    }
    return values;
}
