import { getDateTimeUnit } from '@jnpf/utils';

import dayjs from 'dayjs';
import { cloneDeep } from 'lodash-es';

export function refreshFlowEditTime(fields: any[], formData: any, config: any, now = new Date()) {
  if (String(config.opType) !== '-1' || !config.id || config.disabled || config.readonly) return formData;

  const data = cloneDeep(formData);
  const operates = config.formOperates || [];
  const current = dayjs(now);

  const canWrite = (id: string) => {
    const operate = operates.find((item) => item.id === id);
    return !operate || !!operate.write;
  };
  const visit = (items: any[], record: any, tableName = '') => {
    for (const item of items || []) {
      const fieldName = item.__vModel__;
      const fieldConfig = item.__config__;
      if (!fieldConfig) continue;

      const operateId = tableName ? `${tableName}-${fieldName}` : fieldName;
      if (fieldConfig.jnpfKey === 'table') {
        if (fieldName && canWrite(operateId) && Array.isArray(record[fieldName])) {
          for (const row of record[fieldName]) {
            if (row && typeof row === 'object') visit(fieldConfig.children, row, fieldName);
          }
        }
        continue;
      }

      if (fieldName && fieldConfig.updateOnFlowEdit && canWrite(operateId)) {
        if (fieldConfig.jnpfKey === 'datePicker') record[fieldName] = current.startOf(getDateTimeUnit(item.format)).valueOf();
        if (fieldConfig.jnpfKey === 'timePicker') record[fieldName] = current.format(item.format || 'HH:mm:ss');
      }
      if (Array.isArray(fieldConfig.children)) visit(fieldConfig.children, record, tableName);
    }
  };
  visit(fields, data);
  return data;
}
