import { cloneDeep } from 'lodash-es';

export type DynamicModelActionType = 'add' | 'detail' | 'edit';

export interface OpenDynamicModelOptions {
  id?: string;
  menuId?: string;
  modelId: string;
  onSuccess?: (data?: any) => void;
  params?: Record<string, any>;
  success?: (data?: any) => void;
  title?: string;
}

export interface DynamicModelOpenContext {
  isDataManage?: boolean;
  isPreview?: boolean;
}

export interface ParsedDynamicModelConfig {
  columnData: Record<string, any>;
  formConf: Record<string, any>;
  fullName: string;
  webType: number | string;
}

export function validateDynamicModelActionOptions(action: DynamicModelActionType, options?: OpenDynamicModelOptions) {
  if (!options?.modelId) throw new Error('缺少模型 id');
  if ((action === 'edit' || action === 'detail') && !options.id) throw new Error('缺少数据 id');
}

export function parseTargetDynamicModelConfig(configData: any): ParsedDynamicModelConfig {
  if (!configData) throw new Error('打开表单失败');
  if (`${configData.webType}` === '4') throw new Error('不支持打开数据接口类型');
  if (!configData.formData) throw new Error('目标表单配置异常');

  try {
    return {
      columnData: configData.columnData ? JSON.parse(configData.columnData) : {},
      formConf: JSON.parse(configData.formData),
      fullName: configData.fullName || '',
      webType: configData.webType,
    };
  } catch {
    throw new Error('目标表单配置异常');
  }
}

export function buildDynamicModelOpenData(
  action: DynamicModelActionType,
  input: {
    context: DynamicModelOpenContext;
    options: OpenDynamicModelOptions;
    target: ParsedDynamicModelConfig;
  },
) {
  const { context, options, target } = input;
  const formConf = cloneDeep(target.formConf);
  const menuId = options.menuId || '';
  const useFormPermission = !!menuId && !!target.columnData.useFormPermission;
  const title = action === 'detail' ? options.title || '' : options.title || target.fullName;
  const id = action === 'add' ? '' : options.id;

  const baseData = {
    formConf,
    id,
    isDataManage: !!context.isDataManage,
    isPreview: !!context.isPreview,
    menuId,
    modelId: options.modelId,
    onSuccess: options.onSuccess || options.success,
    title,
    useFormPermission,
  };

  if (action === 'detail') {
    return {
      ...baseData,
      hideExtra: !!context.isDataManage,
    };
  }

  return {
    ...baseData,
    allList: [],
    formData: options.params || undefined,
    showMoreBtn: action === 'edit' ? false : ![3, 5].includes(Number(target.columnData.type)),
  };
}
