/**
 * 通用表单配置转换工具（兼容复杂/简单数据结构）
 * 特性：
 * 1. 支持任意层级嵌套的容器组件（row/col/card/form/tabs等）
 * 2. 兼容未知组件类型，避免转换失败
 * 3. 自动继承父容器属性（如表单的labelWidth向下传递）
 * 4. 支持动态属性合并（源配置属性优先级高于默认值）
 */

// -------------------------- 类型定义 --------------------------
/** 源配置基础类型（递归结构） */
interface SourceNode {
    id: string;
    type: string;
    label?: string;
    field?: string;
    input?: boolean; // 是否为输入型组件
    children?: SourceNode[];
    componentProps?: Record<string, any>;
    [key: string]: any; // 支持任意扩展属性
}

/** 转换后节点的基础属性 */
interface BaseTransformedNode {
    id: string;
    type: "container" | "formItem";
    label: string;
    inheritProps?: Record<string, any>; // 继承的父容器属性
}

/** 转换后的容器节点 */
interface TransformedContainer extends BaseTransformedNode {
    type: "container";
    containerType: string; // 容器类型（gridRow/card/form等）
    props: Record<string, any>; // 容器自身属性
    children: TransformedNode[]; // 子节点（容器或表单项）
}

/** 转换后的表单项目节点 */
interface TransformedFormItem extends BaseTransformedNode {
    type: "formItem";
    component: string; // 对应的UI组件（ElInput/ElSelect等）
    field: string; // 表单字段名
    value: any; // 默认值
    required: boolean; // 是否必填
    props: Record<string, any>; // 组件属性
}

/** 转换后所有节点的联合类型 */
type TransformedNode = TransformedContainer | TransformedFormItem;

// -------------------------- 核心配置 --------------------------
/** 容器类型映射（支持扩展） */
const containerConfig: Record<
    string,
    {
        type: string; // 目标容器类型
        defaultProps: Record<string, any>; // 默认属性
        inheritKeys?: string[]; // 需要向下传递的属性键名
    }
> = {
    row: {
        type: "gridRow",
        defaultProps: { gutter: 16, justify: "start" },
        inheritKeys: []
    },
    col: {
        type: "gridCol",
        defaultProps: { span: 24 },
        inheritKeys: []
    },
    card: {
        type: "card",
        defaultProps: { title: "", bordered: true },
        inheritKeys: []
    },
    form: {
        type: "form",
        defaultProps: {
            labelWidth: 100,
            labelPosition: "right",
            layout: "horizontal"
        },
        // 表单容器需要向下传递的属性（影响内部表单项）
        inheritKeys: ["labelWidth", "labelPosition", "labelCol", "wrapperCol"]
    },
    tabs: {
        type: "tabs",
        defaultProps: { type: "card" },
        inheritKeys: []
    },
    tabPane: {
        type: "tabPane",
        defaultProps: { label: "标签页" },
        inheritKeys: []
    }
};

/** 表单组件映射（支持扩展） */
const componentConfig: Record<
    string,
    {
        component: string; // 对应的UI组件
        defaultProps: Record<string, any>; // 默认属性
    }
> = {
    input: {
        component: "ElInput",
        defaultProps: { placeholder: "请输入", type: "text" }
    },
    select: {
        component: "ElSelect",
        defaultProps: { placeholder: "请选择", options: [] }
    },
    radio: {
        component: "ElRadioGroup",
        defaultProps: { options: [], placeholder: "请选择" }
    },
    checkbox: {
        component: "ElCheckboxGroup",
        defaultProps: { options: [] }
    },
    "upload-image": {
        component: "ElUpload",
        defaultProps: { action: "", listType: "picture" }
    },
    "upload-file": {
        component: "ElUpload",
        defaultProps: { action: "", listType: "text" }
    },
    date: {
        component: "ElDatePicker",
        defaultProps: { format: "YYYY-MM-DD" }
    }
    // 可扩展更多组件类型
};

// -------------------------- 转换逻辑 --------------------------
/**
 * 递归转换节点（核心函数）
 * @param node 源节点
 * @param parentInheritProps 从父容器继承的属性
 * @returns 转换后的节点
 */
const transformNode = (node: SourceNode, parentInheritProps: Record<string, any> = {}): TransformedNode => {
    // 1. 处理容器类型节点
    if (containerConfig[node.type]) {
        const { type: containerType, defaultProps, inheritKeys } = containerConfig[node.type];
        const nodeProps = node.componentProps || {};

        // 合并默认属性和源属性（源属性优先级更高）
        const containerProps = { ...defaultProps, ...nodeProps };

        // 计算当前容器需要向下传递的属性
        const currentInheritProps = inheritKeys
            ? inheritKeys.reduce((acc, key) => {
                  // 优先使用当前容器的属性，其次继承父容器的
                  acc[key] = containerProps[key] !== undefined ? containerProps[key] : parentInheritProps[key];
                  return acc;
              }, {} as Record<string, any>)
            : parentInheritProps;

        // 递归转换子节点（传递继承属性）
        const children = node.children ? node.children.map(child => transformNode(child, currentInheritProps)) : [];

        return {
            id: `container_${node.id}`,
            type: "container",
            containerType,
            label: node.label || containerType,
            props: containerProps,
            children,
            inheritProps: currentInheritProps // 记录当前容器的继承属性（便于调试）
        };
    }

    // 2. 处理表单组件节点（input为true的组件）
    if (node.input) {
        // 兼容未配置的组件类型（默认视为输入框）
        const config = componentConfig[node.type] || {
            component: "ElInput",
            defaultProps: { placeholder: `请输入${node.label || ""}` }
        };
        const nodeProps = node.componentProps || {};

        // 合并默认属性、继承属性和源属性
        const componentProps = {
            ...config.defaultProps,
            ...parentInheritProps, // 继承父容器的属性（如labelWidth）
            ...nodeProps // 源属性优先级最高
        };

        return {
            id: `formItem_${node.id}`,
            type: "formItem",
            label: node.label || "",
            component: config.component,
            field: node.field || `field_${node.id}`, // 确保field存在
            value: nodeProps.defaultValue ?? null, // 从源配置取默认值
            required: nodeProps.required ?? false,
            props: componentProps,
            inheritProps: parentInheritProps
        };
    }

    // 3. 处理未知类型节点（容错处理）
    return {
        id: `unknown_${node.id}`,
        type: "formItem",
        label: node.label || `未知组件(${node.type})`,
        component: "ElInput", // 默认使用输入框占位
        field: `unknown_${node.id}`,
        value: null,
        required: false,
        props: {
            placeholder: `未支持的组件类型: ${node.type}`,
            disabled: true // 未知组件默认禁用
        },
        inheritProps: parentInheritProps
    };
};

/**
 * 入口函数：转换整个表单配置
 * @param source 源配置数组（root.children）
 * @returns 转换后的节点数组
 */
export const transformFormConfig = (source: SourceNode[]): TransformedNode[] => {
    return source.map(node => transformNode(node));
};
