import { isEmpty } from '@/utils/validate';
import settings from '@/settings';
import request from '@/utils/request';
import { message } from "ant-design-vue";
import { convertToTree, findNodes } from '@/utils/treeUtil';
const systemPrefix = settings.systemPrefix;

/**
 * 根据树的类型获取树数据、默认值和默认节点
 * @param {Object} props - 包含树类型、异步标志等属性的对象
 * @param {Object} param - 额外的参数对象
 * @returns {Promise<Object>} - 包含树数据、默认值和默认节点的对象
 */
export const getTreeData = async (props, param) => {
    // 初始化变量
    let treeData = []; // 存储树数据
    // let defaultValue = []; // 存储默认值
    // let defaultNode = []; // 存储默认节点
    let defaultValue; // 存储默认值
    let defaultNode; // 存储默认节点
    let defaultStddNo = ''; // 存储标准编号
    let apiParams = {}; // 存储请求的参数
    let apiUrl = ''; // 存储请求的 API 地址

    // 解构出异步标志
    const { isAsync } = { ...props };

    // 根据不同的树类型构建请求的 API 地址和参数
    switch (props.treeType) {
        case 'deptTree': {
            // 解构出关联编号
            const { relationNo } = { ...props };
            // 解构出 ID
            const { id } = { ...param };
            apiUrl = '/system/common/action/searchTreeData.do';
            apiParams = {
                tree_type: 'departRight',
                isAsync, // 使用解构出的 isAsync
                relation_info_no: relationNo,
                id: isEmpty(id) ? '' : id,
            };
            break;
        }
        case 'sobTree': {
            // 解构出分支编号数组
            const { brNos } = { ...props };
            apiUrl = '/im/dhc/zz/automake/zzmanage/accounting_manager/generalAccount_manager/ComDepartSobTreeController.do';
            apiParams = {
                opt_type: 'search',
                tx_br_no: brNos.join(','),
            };
            break;
        }
        case 'sobItemTree': {
            // 解构出标准编号和子业务编号
            const { stddNo, sobNo } = { ...props };
            apiUrl = '/im/dhc/zz/automake/zzmanage/comitem_manager/ComModItemInfoQueryController.do';
            apiParams = {
                type: "sobItemTree",
                whereSql: `WHERE STDD_NO = ? AND SOB_NO = ? AND USE_YN ='Y'`,
                params: `${stddNo},${sobNo}`,
            };
            break;
        }
        default:
            break;
    }

    try {
        // 调用发送请求的函数获取响应数据
        const resp = await sendRequest(apiUrl, apiParams);
        // 根据异步标志处理响应数据
        if (isAsync) {
            // 异步模式下直接使用响应数据
            treeData = resp; 
        } else {
            // 非异步模式下将响应数据转换为树状结构
            treeData = convertToTree(resp);
        }

        // 根据不同的树类型设置默认值和默认节点
        switch (props.treeType) {
            case 'deptTree':
                if (treeData.length > 0) {
                    // 去除默认节点的 children 属性
                    const { children, ...nodeWithoutChildren } = treeData[0];
                    //defaultNode.push(nodeWithoutChildren);
                    defaultNode = [nodeWithoutChildren];
                    // 从默认节点中获取默认值
                    defaultValue = [nodeWithoutChildren[props.fieldNames.key]];
                }
                break;
            case 'sobTree':
                if (treeData.length > 0) {
                    // 根据属性查找默认节点
                    defaultNode = findNodes(treeData, 'default_yn', 'Y');
                    if (!isEmpty(defaultNode) && defaultNode.length > 0) {
                        // 从默认节点的父节点 ID 中提取标准编号
                        defaultStddNo = defaultNode[0]['pid'].split('@')[0];
                        // 从默认节点中获取默认值
                        // defaultValue = [defaultNode[0][props.fieldNames.key]];
                        defaultValue = defaultNode[0][props.fieldNames.key];
                    }
                }
                break;
            case 'sobItemTree':
                // 可根据 sobItemTree 的具体需求添加默认值和默认节点的逻辑
                break;
            default:
                break;
        }
    } catch (error) {
        // 处理请求失败的情况，显示错误消息
        message.error(`请求失败: ${error.message}`);
    }

    // 返回包含树数据、默认值和默认节点的对象
    return {
        treeData,
        defaultValue,
        defaultNode,
        defaultStddNo
    };
};

// 定义一个函数，用于发送请求
function sendRequest (apiUrl, apiParams) {
    return request(`${systemPrefix}${apiUrl}`, {
        method: 'post',
        data: apiParams,
        requestType: 'form',
    });
}
