// @ts-nocheck
import { chain as parseInput, chainAsync as parseInputAsync } from '../plugins/input/index.js';
import fetchId from '../util/fetchId.js';
/**
 * Add an object to the array of objects
 *
 * @memberof module:@citation-js/core.Cite#
 *
 * @param {module:@citation-js/core~InputData} data - The data to add to your object
 * @param {module:@citation-js/core~InputOptions} [options] - Options
 * @param {Boolean} [log=false] - Show this call in the log
 *
 * @return {module:@citation-js/core.Cite} The updated parent object
 */
function add(data, options = {}, log = false) {
    if (options === true || log === true) {
        this.save();
    }
    this.data.push(...parseInput(data, options));
    this.data
        .filter((entry) => !Object.prototype.hasOwnProperty.call(entry, 'id'))
        .forEach((entry) => {
        entry.id = fetchId(this.getIds(), 'temp_id_');
    });
    return this;
}
/**
 * Add an object to the array of objects
 *
 * @memberof module:@citation-js/core.Cite#
 *
 * @param {module:@citation-js/core~InputData} data - The data to add to your object
 * @param {module:@citation-js/core~InputOptions} [options] - Options
 * @param {Boolean} [log=false] - Show this call in the log
 *
 * @return {Promise<module:@citation-js/core.Cite>} The updated parent object
 */
async function addAsync(data, options = {}, log = false) {
    if (options === true || log === true) {
        this.save();
    }
    this.data.push(...(await parseInputAsync(data, options)));
    this.data
        .filter((entry) => !Object.prototype.hasOwnProperty.call(entry, 'id'))
        .forEach((entry) => {
        entry.id = fetchId(this.getIds(), 'temp_id_');
    });
    return this;
}
/**
 * Recreate a `Cite` object with almost any kind of data, and manipulate it with its default methods.
 *
 * @memberof module:@citation-js/core.Cite#
 *
 * @param {module:@citation-js/core~InputData} data - Replacement data
 * @param {module:@citation-js/core~InputOptions} [options] - Options
 * @param {Boolean} [log=false] - Show this call in the log
 *
 * @return {module:@citation-js/core.Cite} The updated parent object
 */
function set(data, options = {}, log = false) {
    if (options === true || log === true) {
        this.save();
    }
    this.data = [];
    return typeof options !== 'boolean' ? this.add(data, options) : this.add(data);
}
/**
 * Recreate a `Cite` object with almost any kind of data, and manipulate it with its default methods.
 *
 * @memberof module:@citation-js/core.Cite#
 *
 * @param {module:@citation-js/core~InputData} data - Replacement data
 * @param {module:@citation-js/core~InputOptions} [options] - Options
 * @param {Boolean} [log=false] - Show this call in the log
 *
 * @return {Promise<module:@citation-js/core.Cite>} The updated parent object
 */
async function setAsync(data, options = {}, log = false) {
    if (options === true || log === true) {
        this.save();
    }
    this.data = [];
    return typeof options !== 'boolean' ? this.addAsync(data, options) : this.addAsync(data);
}
/**
 * Reset a `Cite` object.
 *
 * @memberof module:@citation-js/core.Cite#
 *
 * @param {Boolean} [log=false] - Show this call in the log
 *
 * @return {module:@citation-js/core.Cite} The updated, empty parent object (except the log, the log lives)
 */
function reset(log) {
    if (log) {
        this.save();
    }
    this.data = [];
    this._options = {};
    return this;
}
export { add, addAsync, set, setAsync, reset };
