import { cloneDeep } from 'lodash-es';

export function isDisplayOnlyField(field: any) {
  return field?.__config__?.isDisplayOnly === true;
}

export function isVirtualField(field: any) {
  return field?.__config__?.isVirtualField === true;
}

export function isVirtualTable(field: any) {
  return field?.__config__?.jnpfKey === 'table' && isVirtualField(field);
}

export function getFieldDataKey(field: any) {
  return isVirtualField(field) ? field?.controlKey : field?.__vModel__;
}

function getDefaultVirtualFieldKey(field: any) {
  if (field?.controlKey || field?.__vModel__) return field.controlKey || field.__vModel__;
  const formId = field?.__config__?.formId || '';
  return `${field?.__config__?.jnpfKey || 'field'}Field${formId.replace('formItem', '')}`;
}

export function setVirtualField(field: any, enabled: boolean, inherited = false) {
  const config = field?.__config__;
  if (!config) return;
  if (enabled) {
    const wasVirtual = isVirtualField(field);
    field.controlKey = getDefaultVirtualFieldKey(field);
    field.__vModel__ = '';
    config.isVirtualField = true;
    config.isDisplayOnly = false;
    config.biz_log_enabled = false;
    if (inherited && !wasVirtual) config.isVirtualFieldInherited = true;
    return;
  }
  config.isVirtualField = false;
  config.isVirtualFieldInherited = false;
  field.controlKey = '';
}

export function setVirtualTable(table: any, enabled: boolean) {
  const config = table?.__config__;
  if (!config || config.jnpfKey !== 'table') return;
  const children = Array.isArray(config.children) ? config.children : [];
  if (enabled) {
    setVirtualField(table, true);
    config.tableName = '';
    for (const child of children) {
      setVirtualField(child, true, true);
      child.__config__.isSubTable = true;
      child.__config__.parentVModel = table.controlKey;
      child.__config__.relationTable = '';
    }
    return;
  }
  const tableDataKey = getFieldDataKey(table);
  setVirtualField(table, false);
  table.__vModel__ = tableDataKey || '';
  for (const child of children) {
    child.__config__.parentVModel = table.__vModel__;
    child.__config__.relationTable = '';
    if (!child.__config__.isVirtualFieldInherited) continue;
    setVirtualField(child, false);
    child.__vModel__ = '';
  }
}

/**
 * 虚拟字段在设计数据中不占用数据库字段，运行时使用 controlKey 作为表单数据键。
 */
export function normalizeVirtualFields(fields: any[]) {
  if (!Array.isArray(fields)) return;
  for (const field of fields) {
    const config = field?.__config__;
    if (!config) continue;
    if (isVirtualField(field)) {
      field.controlKey = getDefaultVirtualFieldKey(field);
      field.__vModel__ = field.controlKey;
      if (config.jnpfKey === 'table' && Array.isArray(config.children)) {
        for (const child of config.children) {
          setVirtualField(child, true, true);
          child.__config__.parentVModel = field.__vModel__;
        }
      }
    }
    if (Array.isArray(config.children)) normalizeVirtualFields(config.children);
  }
}

/**
 * 从提交副本中移除仅展示字段。布局沿用当前数据层级，子表按行继续处理。
 */
export function buildDisplayOnlySubmitData(fields: any[], formData: any) {
  const data = cloneDeep(formData || {});

  function walk(fieldList: any[], currentData: any) {
    if (!Array.isArray(fieldList) || !currentData || typeof currentData !== 'object') return;
    for (const field of fieldList) {
      const config = field?.__config__;
      if (!config) continue;
      const vModel = getFieldDataKey(field);
      if ((isDisplayOnlyField(field) || isVirtualField(field)) && vModel) {
        delete currentData[vModel];
        continue;
      }
      if (!Array.isArray(config.children)) continue;
      if (config.jnpfKey === 'table' && vModel) {
        const rows = currentData[vModel];
        if (Array.isArray(rows)) {
          rows.forEach((row) => walk(config.children, row));
        }
      } else {
        walk(config.children, currentData);
      }
    }
  }

  walk(fields, data);
  return data;
}
