import type { IVFormComponent } from '../types';

import { isNumber } from '@vben/utils';

import { buildUUID, toLine } from '#/utils';

/**
 * 生成key
 * @param [formItem] 需要生成 key 的控件，可选，如果不传，默认返回一个唯一 key
 * @returns {string|boolean} 返回一个唯一 id 或者 false
 */
export function generateKey(formItem?: IVFormComponent): boolean | string {
  if (formItem && formItem.component) {
    const key = `${toLine(formItem.component)}_${buildUUID()}`;
    formItem.key = key;
    formItem.fieldName = key;

    return true;
  }
  return `key_${buildUUID()}`;
}

/**
 * 移除数组中指定元素，value可以是一个数字下标，也可以是一个函数，删除函数第一个返回true的元素
 * @param array {Array<T>} 需要移除元素的数组
 * @param value {number | ((item: T, index: number, array: Array<T>) => boolean}
 * @returns {T} 返回删除的数组项
 */
export function remove<T>(
  array: Array<T>,
  value: ((item: T, index: number, array: Array<T>) => boolean) | number,
): T | undefined {
  let removeVal: Array<T | undefined> = [];
  if (!Array.isArray(array)) return undefined;
  if (isNumber(value)) {
    removeVal = array.splice(value, 1);
  } else {
    const predicate = value as (
      item: T,
      index: number,
      array: Array<T>,
    ) => boolean;
    const index = array.findIndex((item, idx, arr) =>
      predicate(item, idx, arr),
    );
    if (index !== -1) {
      removeVal = array.splice(index, 1);
    }
  }
  return removeVal.shift();
}
