layui.config({
    base: '/admin/assets/lib/jplus/treeTable/'
}).use(['form', 'layer', 'table', 'laytpl', 'treeTable'], function () {
    const form = layui.form,
        layer = parent.layer === undefined ? layui.layer : top.layer,
        $ = layui.jquery,
        laytpl = layui.laytpl,
        table = layui.table,
        treeTable = layui.treeTable;

    // 常量定义
    const TABLE_ID = 'listTable';
    const DEFAULT_LIMIT = 15;
    const PAGE_SIZES = [10, 15, 20, 25];

    // 用户状态映射
    const USER_STATUS_MAP = {
        '0': '默认',
        '1': '无效',
        '2': '被删除',
        '3': '暂停使用',
        '_default': '异常用户'
    };

    // 用户类型映射
    const USER_TYPE_MAP = {
        '0': '默认用户',
        '1': '普通管理员',
        '2': '系统管理员',
        '3': '区域管理员',
        '9': '超级管理员',
        '_default': '未授权用户'
    };

    // 性别映射
    const GENDER_MAP = {
        '0': '男',
        '1': '女',
        '2': '保密',
        '_default': '保密'
    };
    // 内外网映射
    const NET_MAP = {
        '0': '内网',
        '1': '外网',
        '2': '专用',
        '9': '通用',
        '_default': '通用'
    };

    /**
     * 格式化时间显示
     * @param {Date|string|number} tempDate - 时间
     * @returns {string} 格式化后的时间字符串
     */
    function formatTime(tempDate) {
        if (!tempDate) return '';

        const d = new Date(tempDate);
        if (isNaN(d.getTime())) return '';

        const year = d.getFullYear();
        const month = String(d.getMonth() + 1).padStart(2, '0');
        const day = String(d.getDate()).padStart(2, '0');
        const hours = String(d.getHours()).padStart(2, '0');
        const minutes = String(d.getMinutes()).padStart(2, '0');
        const seconds = String(d.getSeconds()).padStart(2, '0');

        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    }

    /**
     * 根据映射表获取对应值
     * @param {string} key - 键值
     * @param {Object} map - 映射表
     * @returns {string} 对应的显示文本
     */
    function getMappedValue(key, map) {
        return map[key] || map._default || '';
    }

    /**
     * 打开编辑弹窗
     * @param {Object} editData - 编辑的数据，为空时表示新增
     */
    function openEditDialog(editData = null) {
        const title = editData ? '修改用户' : '添加用户';
        const index = layui.layer.open({
            title,
            type: 2,
            content: '/upms/user/edit.html',
            area: ['95%', '95%'],
            success: function (layero, index) {
                const body = layui.layer.getChildFrame('body', index);
                if (editData) {
                    // 填充表单数据
                    body.find('#id').val(editData.id);
                    body.find('.userName').val(editData.userName);
                    body.find('.loginName').val(editData.loginName);
                    body.find('.userAddress').val(editData.userAddress);
                    body.find('.userIdCard').val(editData.userIdCard);
                    body.find('.userMobilePhone').val(editData.userMobilPhone);
                    body.find('.userEmail').val(editData.userEmail);
                    body.find('.userNickName').val(editData.userNickName);
                    body.find('.remark').val(editData.remark);
                    body.find(`.dncnet input[value="${editData.dncnet}"]`).prop('checked', true);
                    body.find(`.userStatus input[value="${editData.userStatus}"]`).prop('checked', true);
                    body.find(`.userType input[value="${editData.userType}"]`).prop('checked', true);
                    body.find(`.userGender input[value="${editData.userGender}"]`).prop('checked', true);
                    body.find('.userGrade').val(editData.userGrade);
                    body.find('.userDesc').text(editData.userDesc);
                    form.render();
                }

                setTimeout(() => {
                    layui.layer.tips('点击此处返回用户列表', '.layui-layer-setwin .layui-layer-close', {
                        tips: 3
                    });
                }, 500);
            }
        });

        // 存储弹窗索引用于响应式调整
        window.sessionStorage.setItem('dialogIndex', index);

        // 响应窗口大小变化
        $(window).off('resize.dialogResize').on('resize.dialogResize', () => {
            layer.full(window.sessionStorage.getItem('dialogIndex'));
        });
    }

    /**
     * 批量删除用户
     */
    function batchDelete() {
        const checkStatus = table.checkStatus(TABLE_ID);
        const { data } = checkStatus;

        if (data.length === 0) {
            layer.msg('请选择需要删除的用户');
            return;
        }

        const idsArr = data.map(item => BigInt(item.id).toString());

        layer.confirm('确定删除选中的用户？', {
            icon: 3,
            title: '提示信息'
        }, function (index) {
            $.ajax({
                url: '/upms/sysuser/deleteByIds',
                type: 'POST',
                dataType: 'json',
                contentType: 'application/json;charset=UTF-8',
                data: JSON.stringify({ idsArr }),
                success: function (res) {
                    if (res.code === 200) {
                        layer.msg('删除成功');
                        tableIns.reload();
                    } else {
                        layer.msg(res.msg || '删除失败');
                    }
                    layer.close(index);
                },
                error: function () {
                    layer.msg('请求失败，请稍后重试');
                    layer.close(index);
                }
            });
        });
    }

    /**
     * 单个删除用户
     * @param {Object} userData - 用户数据
     */
    function deleteUser(userData) {
        layer.confirm('确定删除此用户？', {
            icon: 3,
            title: '提示信息'
        }, function (index) {
            $.ajax({
                url: '/upms/sysuser/delete/'+userData.id,
                type: 'GET',
                data: { id: userData.id },
                success: function (res) {
                    if (res.code === 200) {
                        layer.msg('删除成功');
                        tableIns.reload();
                    } else {
                        layer.msg(res.msg || '删除失败');
                    }
                    layer.close(index);
                },
                error: function () {
                    layer.msg('请求失败，请稍后重试');
                    layer.close(index);
                }
            });
        });
    }

    /**
     * 打开分配角色弹窗
     */
    function openRoleAllotDialog() {
        const checkStatus = table.checkStatus(TABLE_ID);
        const { data } = checkStatus;

        if (data.length === 0) {
            layer.msg('请选择需要分配权限的用户');
            return;
        }

        const ids = data.map(item => item.id).join(',');
        const index = layui.layer.open({
            title: '分配角色',
            type: 2,
            content: '/upms/user/allot.html/'+ids,
            area: ['100%', '100%'],
            success: function () {
                const body = layui.layer.getChildFrame('body', index);
                body.find('#ids').val(ids);
                /*setTimeout(() => {
                    layer.tips('点击此处返回用户列表', '.layui-layer-setwin .layui-layer-close', {
                        tips: 3
                    });
                }, 500);*/
            }
        });

        layer.full(index);
        window.sessionStorage.setItem('roleDialogIndex', index);

        $(window).off('resize.roleDialogResize').on('resize.roleDialogResize', () => {
            layer.full(window.sessionStorage.getItem('roleDialogIndex'));
        });
    }

    // 表格配置
    const tableConfig = {
        elem: '#list',
        url: '/upms/sysuser/queryPage',
        method: 'POST',
        contentType: 'application/json;charset=utf-8',
        cellMinWidth: 95,
        page: true,
        height: 'full-125',
        limits: PAGE_SIZES,
        limit: DEFAULT_LIMIT,
        id: TABLE_ID,
        request: {
            pageName: 'pageNo',
            limitName: 'pageRows'
        },
        response: {
            statusName: 'code',
            statusCode: 200,
            msgName: 'msg',
            countName: 'totalRows',
            dataName: 'data'
        },
        parseData: function (res) {
            return {
                code: res.code,
                msg: res.msg,
                totalRows: res.data?.totalRows || 0,
                data: res.data?.dataList || []
            };
        },
        cols: [[
            { type: 'checkbox', fixed: 'left', width: 50 },
            { field: 'userName', title: '用户名', minWidth: 100, align: 'center' },
            { field: 'loginName', title: '登录名', minWidth: 100, align: 'center' },
            {
                field: 'userGender',
                title: '性别',
                align: 'center',
                templet: function (d) {
                    return getMappedValue(d.userGender, GENDER_MAP);
                }
            },
            { field: 'userAddress', title: '用户地址', minWidth: 100, align: 'center' },
            { field: 'userDesc', title: '用户详情', minWidth: 100, align: 'center' },
            {
                field: 'userEmail',
                title: '用户邮箱',
                minWidth: 200,
                align: 'center',
                templet: function (d) {
                    return d.userEmail
                        ? `<a class="layui-blue" href="mailto:${d.userEmail}">${d.userEmail}</a>`
                        : '';
                }
            },
            { field: 'userMobilePhone', title: '手机号码', align: 'center' },
            {
                field: 'userType',
                title: '用户类型',
                align: 'center',
                templet: function (d) {
                    return getMappedValue(d.userType, USER_TYPE_MAP);
                }
            },
            {
                field: 'dncnet',
                title: '内外网',
                align: 'center',
                templet: function (d) {
                    return getMappedValue(d.dncnet, NET_MAP);
                }
            },
            {
                field: 'userStatus',
                title: '用户状态',
                align: 'center',
                templet: function (d) {
                    return getMappedValue(d.userStatus, USER_STATUS_MAP);
                }
            },
            { field: 'userIdCard', title: '身份证号', minWidth: 100, align: 'center' },
            { field: 'orgTreeName', title: '所属组织', minWidth: 100, align: 'center' },
            { field: 'employeeId', title: '工号', minWidth: 100, align: 'center' },
            { field: 'loginerrorTimes', title: '登录错误次数', minWidth: 100, align: 'center' },
            {
                field: 'createTime',
                title: '创建时间',
                minWidth: 100,
                align: 'center',
                templet: function (d) {
                    return formatTime(d.createTime);
                }
            },
            {
                field: 'updateTime',
                title: '修改时间',
                minWidth: 100,
                align: 'center',
                templet: function (d) {
                    return formatTime(d.updateTime);
                }
            },
            {
                field: 'lastLoginTime',
                title: '最后登录时间',
                align: 'center',
                minWidth: 100,
                templet: function (d) {
                    return formatTime(d.lastLoginTime);
                }
            },
            {
                title: '操作',
                minWidth: 200,
                templet: '#listBar',
                fixed: 'right',
                align: 'center',
                toolBar: '#listBar'
            }
        ]]
    };

    // 渲染表格
    const tableIns = table.render(tableConfig);

    // 搜索功能
    $('.search_btn').on('click', function () {
        table.reload(TABLE_ID, {
            page: { curr: 1 },
            where: {
                userName: $('#userName').val(),
                loginName: $('#loginName').val(),
                userMobilePhone: $('#userMobilePhone').val(),
                userNickName: $('#userNickName').val(),
                userEmail: $('#userEmail').val(),
                userIdCard:$('#userIdCard').val(),
                userType:$('#userType').val(),
                userStatus:$('#userStatus').val(),
                userGender:$('#userGender').val(),
                dncnet:$('#dncnet').val(),
                delFlag:$('#delFlag').val()
            }
        });
    });

    // 添加用户
    $('.add_btn').click(() => openEditDialog());

    // 批量删除
    $('.delAll_btn').click(batchDelete);

    // 分配角色
    $('.allot_btn').click(openRoleAllotDialog);

    // 刷新
    $('.refresh').click(() => location.reload());

    // 表格操作监听
    table.on('tool(list)', function (obj) {
        const { event, data } = obj;

        switch (event) {
            case 'edit':
                openEditDialog(data);
                break;

            case 'usable':
                handleUserStatusChange($(this), data);
                break;

            case 'del':
                deleteUser(data);
                break;
        }
    });

    /**
     * 处理用户状态变更
     * @param {jQuery} $element - 触发元素
     * @param {Object} userData - 用户数据
     */
    function handleUserStatusChange($element, userData) {
        const isEnabled = $element.text() !== '已禁用';
        const confirmText = isEnabled ? '是否确定禁用此用户？' : '是否确定启用此用户？';
        const btnText = isEnabled ? '已禁用' : '已启用';

        layer.confirm(confirmText, {
            icon: 3,
            title: '系统提示'
        }, function (index) {
            // 这里应该调用API更新状态
            $.ajax({
                url: '/upms/sysuser/updateStatus',
                type: 'POST',
                data: {
                    id: userData.id,
                    status: isEnabled ? 'disabled' : 'enabled'
                },
                success: function (res) {
                    if (res.code === 200) {
                        $element.text(btnText);
                        layer.msg('状态更新成功');
                    } else {
                        layer.msg(res.msg || '状态更新失败');
                    }
                    layer.close(index);
                },
                error: function () {
                    layer.msg('请求失败，请稍后重试');
                    layer.close(index);
                }
            });
        });
    }
});