const el = {
    bodyHeight: document.documentElement.clientHeight,
    headForm: "#headForm",
    tabsHeader: ".tabs-header",
    checkbox_detail: "#checkbox_detail",
    checkbox_right: '#checkbox_right',
    tt: "#tt",
    divPurchaseDetail: "#divPurchaseDetail",
    divPaymentDetail: "#divPaymentDetail",
    tbPurchaseDetail: "#tbPurchaseDetail",
    tbPaymentDetail: "#tbPaymentDetail"
}
let editIndex = undefined;
$(function () {
    initDict('unit,gx_contract_subject,payment_stage,payment_period,payment_way');
    initNecessaryDatas('pc/sys/tax/rest/listAll');
    syncCheckboxGroupStatus();
    initEvent();
    initTable();
    initDisplay();
});

/**
 * 初始化显示
 */
function initDisplay() {
    // 初始化时隐藏表格
    $(el.tt).tabs('disableTab', '采购明细');
    $(el.tt).tabs('disableTab', '付款条款');
    $(el.tbPurchaseDetail).datagrid('getPanel').panel('close');
    $(el.tbPaymentDetail).datagrid('getPanel').panel('close');
}

/**
 * 初始化事件
 */
function initEvent() {
    $(el.checkbox_detail).on('change', function () {
        syncCheckboxGroupStatus();
        if (this.checked) {
            $(el.tt).tabs('enableTab', '采购明细');
            $(el.tt).tabs('enableTab', '付款条款');
            $(el.tt).tabs('select', '采购明细');

            $(el.tbPurchaseDetail).datagrid('getPanel').panel('open');
            $(el.tbPurchaseDetail).datagrid('resize');
            $(el.tbPaymentDetail).datagrid('getPanel').panel('open');
            $(el.tbPaymentDetail).datagrid('resize');
        } else {
            $(el.tt).tabs('disableTab', '采购明细');
            $(el.tbPurchaseDetail).datagrid('getPanel').panel('close');
            $(el.tt).tabs('disableTab', '付款条款');
            $(el.tbPaymentDetail).datagrid('getPanel').panel('close');
        }
    });

    $(el.checkbox_right).on('change', function () {
        syncCheckboxGroupStatus();
    });
}

/**
 * 初始化表格
 */
function initTable() {
    const searchHeight = $(el.headForm).outerHeight();
    const tabsHeader = $(el.tabsHeader).outerHeight();
    // 采购明细
    $(el.tbPurchaseDetail).datagrid({
        iconCls: 'icon-list',
        url: '/pc/contract/mroManage/rest/selectContractDetailListPage?conId=' + id,
        height: el.bodyHeight - searchHeight - tabsHeader,
        fitColumns:true,
        pagination: true,
        loadMsg: "数据加载中......",
        rownumbers: true,
        nowrap: true,
        striped: true,
        page: 1,
        pageSize: 10,
        // 核心：开启单元格编辑模式
        editable: true, // 必须开启
        editMode: 'cell', // 单元格编辑模式（而非行编辑）
        columns: [[
            {
                field: 'ck',
                checkbox: true
            },
            {
                field: 'subjectCode',
                title: '资产类别<button type="button" onclick="copy(\'subjectCode\')" class="easyui-linkbutton">复制</button>',
                width:'140',
                formatter: function (value) { return getDicName('gx_contract_subject',value) },
                editor: {
                    type: 'combobox', // 资产类别用下拉框
                    options: {
                        valueField: 'code',
                        textField: 'name',
                        data: getDictList('gx_contract_subject'),
                        editable: false
                    }
                }
            },
            {
                field: 'materialName',
                title: '物品名称',
                width:'120',
                editor: 'text'
            },
            {
                field: 'materialSpec',
                title: '型号规格/参数',
                width:'120',
                editor: 'text'
            },
            {
                field: 'materialBrand',
                title: '品牌',
                width:'120',
                editor: 'text'
            },
            {
                field: 'num',
                title: '数量',
                width:'60',
                editor: {
                    type: 'numberbox',
                    options: {min: 0, precision: 0}
                }
            },
            {
                field: 'basisUnit',
                title: '单位',
                width:'80',
                formatter: function (value) { return getDicName('unit',value) },
                editor: {
                    type: 'combobox',
                    options: {
                        valueField: 'code',
                        textField: 'codeWithDesc',
                        data: getDictList('unit'),
                        editable: false
                    }
                }
            },
            {
                field: 'noTaxPrice',
                title: '未税单价',
                width:'120 ' ,
                editor: {
                    type: 'numberbox',
                    options: {min: 0, precision: 2}
                }
            },
            {
                field: 'taxRateCode',
                title: '税率',
                width: '10%',
                align: 'center',
                editor: {
                    type: 'combobox',
                    options: {
                        limitToList: true,
                        valueField: 'code',
                        textField: 'codeWithDesc',
                        panelHeight: 'auto',
                        required: true,
                        editable: false,
                        data: getNecessaryDataList("pc/sys/tax/rest/listAll"),
                        onChange: function (newValue) {
                            // 获取当前正在编辑的行索引（需提前保存）
                            const editIndex = window.currentEditIndex; // 或通过其他方式获取
                            if (editIndex === undefined) return;

                            // 获取当前行的所有字段值（包括未提交的编辑值）
                            const row = $(el.tbPurchaseDetail).edatagrid('getRows')[editIndex];

                            // 获取含税单价（price），可能来自已编辑但未保存的值
                            const priceEditor = $(el.tbPurchaseDetail).edatagrid('getEditor', {
                                index: editIndex,
                                field: 'price'
                            });
                            const price = priceEditor
                                ? parseFloat($(priceEditor.target).numberbox('getValue') || 0)
                                : parseFloat(row.price || 0);

                            // 如果价格为空或非数字，不计算
                            if (isNaN(price) || price <= 0) {
                                return;
                            }

                            // 根据 newValue（即 taxRateCode）查找对应的税率数值（value）
                            const taxData = getNecessaryDataList("pc/sys/tax/rest/listAll");
                            const taxItem = taxData.find(item => item.code === newValue);
                            const taxRate = taxItem ? (parseFloat(taxItem.taxValue)) : 0; // 转为小数，如 13 → 0.13

                            // 计算未税单价：noTaxPrice = price / (1 + taxRate)
                            const noTaxPrice = price / (1 + taxRate);

                            // 更新 noTaxPrice 字段（通过 editor 安全设置）
                            const noTaxEditor = $(el.tbPurchaseDetail).edatagrid('getEditor', {
                                index: editIndex,
                                field: 'noTaxPrice'
                            });

                            if (noTaxEditor) {
                                $(noTaxEditor.target).numberbox('setValue', parseFloat(noTaxPrice.toFixed(2)));
                            } else {
                                // 如果 noTaxPrice 不在编辑状态，直接更新行数据（下次编辑会生效）
                                $(el.tbPurchaseDetail).edatagrid('updateRow', {
                                    index: editIndex,
                                    row: { noTaxPrice: parseFloat(noTaxPrice.toFixed(2)) }
                                });
                            }
                        }
                    }
                },
                formatter: function (value) {
                    return getNecessaryDataName('pc/sys/tax/rest/listAll', value);
                }
            },
            {
                field: 'price',
                title: '含税单价',
                width:'120 ',
                editor: {
                    type: 'numberbox',
                    options: {min: 0, precision: 2}
                }
            },
            {
                field: 'amount',
                title: '含税金额',
                width:'120',
                formatter: function (value, row) {
                    if (row.price !=null && row.num) {
                        return (parseFloat(row.price) * parseFloat(row.num)).toFixed(2);
                    }
                }
            },
            {
                field: 'teamName',
                title: '使用部门',
                width: '120',
                editor: 'text'},
            {
                field: 'requireName',
                title: '使用人',
                width: '120',
                editor: 'text'},
            {
                field: 'costCenterCode',
                title: '成本中心编码',
                hidden: true, // 隐藏存储编码
                editor: 'text' // 保留文本编辑器（如需手动改编码可保留，否则可删）
            },
            {
                field: 'costCenterName',
                title: '成本中心',
                width: 150,
                editor: {
                    type: 'textbox',
                    options: {
                        required: false,
                        editable: false,
                        icons: [{
                            iconCls: 'icon-search',
                            handler: function () {
                                // 1. 记录当前编辑行索引
                                editor = window.currentEditIndex;
                                if (editor === undefined) {
                                    layer.alert('请先点击单元格进入编辑状态', {icon: 2});
                                    return;
                                }

                                // 2. 打开弹窗
                                layer.open({
                                    title: "成本中心选择",
                                    type: 2,
                                    area: ['50%', '95%'],
                                    content: g.ctx + 'pc/mall/shoppingPay/page/select',
                                    modal: true,
                                    btn: ['选择', '取消'],
                                    yes: function (index, layero) {
                                        // 获取iframe窗口对象
                                        const iframeWin = layero.find('iframe')[0].contentWindow;
                                        const grid = iframeWin.$('#tb');

                                        if (grid.length === 0) {
                                            layer.alert('未找到成本中心数据表格，请检查弹窗页面是否有id="tb"的表格', {icon: 2});
                                            return;
                                        }

                                        const rows = grid.datagrid('getChecked');
                                        if (rows.length !== 1) {
                                            layer.alert('请选中且仅选中一条成本中心数据', {icon: 2});
                                            return;
                                        }
                                        const row = rows[0];

                                        // 3. 回填成本中心名称（核心修复：先校验editor有效性）
                                        let nameEditor = $(el.tbPurchaseDetail).edatagrid('getEditor', {
                                            index: editor,
                                            field: 'costCenterName'
                                        });
                                        if (nameEditor && nameEditor.target) {
                                            // 转为jQuery对象后操作
                                            $(nameEditor.target).textbox("setValue", row.describe || '');
                                        }

                                        // 4. 回填成本中心编码（修复readonly报错核心逻辑）
                                        let codeEditor = $(el.tbPurchaseDetail).edatagrid('getEditor', {
                                            index: editor,
                                            field: 'costCenterCode'
                                        });
                                        if (codeEditor && codeEditor.target) {
                                            const $codeTarget = $(codeEditor.target);
                                            // 关键：先初始化textbox（如果未初始化）
                                            if (!$codeTarget.hasClass('textbox-f')) {
                                                $codeTarget.textbox(); // 手动初始化textbox组件
                                            }
                                            // 先赋值，再设置只读（分开操作避免冲突）
                                            $codeTarget.textbox("setValue", row.costCenter || '');
                                            // 正确设置readonly的方式（通过options）
                                            $codeTarget.textbox('options').readonly = true;
                                            // 刷新组件使只读生效
                                            // $codeTarget.textbox('refresh');
                                        }

                                        layer.close(index);
                                    },
                                    btn2: function (index) {
                                        layer.close(index);
                                    }
                                });
                            }
                        }]
                    }
                }
            },
            {
                field: 'stockPoint',
                title: '存放地点',
                width: '120',
                editor: 'text' },
            // {
            //     field: 'mainUses',
            //     title: '资产用途',
            //     width: '120',
            //     editor: 'text' },
            {
                field: 'customerCode',
                title: '客户编码',
                hidden: true, // 隐藏存储编码
                editor: 'text' // 保留文本编辑器（如需手动改编码可保留，否则可删）
            },
            {
                field: 'customerName',
                title: '客户',
                width: 150,
                editor: {
                    type: 'textbox',
                    options: {
                        required: false,
                        editable: false,
                        icons: [{
                            iconCls: 'icon-search',
                            handler: function () {
                                // 1. 记录当前编辑行索引
                                editor = window.currentEditIndex;
                                if (editor === undefined) {
                                    layer.alert('请先点击单元格进入编辑状态', {icon: 2});
                                    return;
                                }

                                // 2. 打开弹窗
                                layer.open({
                                    title: "客户选择",
                                    type: 2,
                                    area: ['50%', '95%'],
                                    content: g.ctx + 'pc/supplier/customer/page/select',
                                    modal: true,
                                    btn: ['选择', '取消'],
                                    yes: function (index, layero) {
                                        // 获取iframe窗口对象
                                        const iframeWin = layero.find('iframe')[0].contentWindow;
                                        const grid = iframeWin.$('#tb');

                                        if (grid.length === 0) {
                                            layer.alert('未找到客户数据表格，请检查弹窗页面是否有id="tb"的表格', {icon: 2});
                                            return;
                                        }

                                        const rows = grid.datagrid('getChecked');
                                        if (rows.length !== 1) {
                                            layer.alert('请选中且仅选中一条客户数据', {icon: 2});
                                            return;
                                        }
                                        const row = rows[0];

                                        // 3. 回填客户名称（核心修复：先校验editor有效性）
                                        let nameEditor = $(el.tbPurchaseDetail).edatagrid('getEditor', {
                                            index: editor,
                                            field: 'customerName'
                                        });
                                        if (nameEditor && nameEditor.target) {
                                            // 转为jQuery对象后操作
                                            $(nameEditor.target).textbox("setValue", row.customerName1 || '');
                                        }

                                        // 4. 回填成本中心编码（修复readonly报错核心逻辑）
                                        let codeEditor = $("#table_tb").edatagrid('getEditor', {
                                            index: editor,
                                            field: 'customerCode'
                                        });
                                        if (codeEditor && codeEditor.target) {
                                            const $codeTarget = $(codeEditor.target);
                                            // 关键：先初始化textbox（如果未初始化）
                                            if (!$codeTarget.hasClass('textbox-f')) {
                                                $codeTarget.textbox(); // 手动初始化textbox组件
                                            }
                                            // 先赋值，再设置只读（分开操作避免冲突）
                                            $codeTarget.textbox("setValue", row.customerCode || '');
                                            // 正确设置readonly的方式（通过options）
                                            $codeTarget.textbox('options').readonly = true;
                                            // 刷新组件使只读生效
                                            //  $codeTarget.textbox('refresh');
                                        }

                                        layer.close(index);
                                    },
                                    btn2: function (index) {
                                        layer.close(index);
                                    }
                                });
                            }
                        }]
                    }
                }
            },
            {
                field: 'purchaseCode',
                title: '请购单编号',
                width:  '120',
                editor: 'text'
            },
            {
                field: 'itemCode',
                title: '请购单行号',
                width: '80',
                editor: 'text'
            },
            {
                field: 'deliveryDate',
                title: '交货日期',
                width:'100',
                formatter: function (value) {
                    if (!value) return;
                    return moment(new Date(value)).format('YYYY-MM-DD');
                },
                editor: {
                    type: 'datebox',
                    options: {format: 'yyyy-mm-dd'}
                }
            }
        ]] ,
        //开启编辑
        onClickCell: onClickCell,
    });

    // 付款条款
    $(el.tbPaymentDetail).datagrid({
        iconCls: 'icon-list',
        url: '/pc/contract/mroManage/rest/selectPayListPage?conId=' + id,
        height: el.bodyHeight - searchHeight - tabsHeader,
        fitColumns:true,
        pagination: true,
        loadMsg: "数据加载中......",
        rownumbers: true,
        nowrap: true,
        striped: true,
        page: 1,
        pageSize: 10,
        // 核心：开启单元格编辑模式
        editable: true,
        editMode: 'cell',
        toolbar: [
            {
                text: '新增',
                id: 'btn_add',
                iconCls: 'icon-add',
                handler: function () {
                    addPay();
                }
            },
            {
                text: '删除',
                id: 'btn_order',
                iconCls: 'icon-remove',
                handler: function () {
                    delPay();
                }
            },
        ],
        columns: [[
            {
                field: 'ck',
                checkbox: true
            },
            {field: 'paymentStage', title: '付款笔数',width:'120',
                exportEnum:getDictList('payment_stage'),
                formatter: function (value) { return getDicName('payment_stage',value); },
                // 补充：下拉框编辑器
                editor: {
                    type: 'combobox',
                    options: {
                        valueField: 'code',
                        textField: 'name',
                        data: getDictList('payment_stage'),
                        editable: false
                    }
                }
            },
            {field: 'paymentPeriod', title: '付款阶段',width:'120',
                exportEnum:getDictList('payment_period'),
                formatter: function (value) { return getDicName('payment_period',value); },
                // 补充：下拉框编辑器
                editor: {
                    type: 'combobox',
                    options: {
                        valueField: 'code',
                        textField: 'name',
                        data: getDictList('payment_period'),
                        editable: false
                    }
                }
            },
            {
                field: 'paymentRequirement',
                title: '付款前提条件',
                width: '220',
                editor: 'text',
                // 优化版 formatter：文本省略 + 悬浮提示
                formatter: function() {
                    const showText = '（1）合同需录入合同签订日期，按合同签订日期计算付款起算日期，比如预付款在合同签订1个月内付款，判断付款日期。\n' +
                        '（2）当资产验收申请流程审核通过后，将验收日期反写至SRM，才可以发起资产验收款。\n' +
                        '（3）合同需录入质保期限。';
                    // 给单元格设置样式：超出隐藏、显示省略号
                    return `<span title="${showText}" style="display: inline-block; width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">${showText}</span>`;
                }
            },
            {field: 'paymentWay', title: '付款方式',width:'120',
                exportEnum:getDictList('payment_way'),
                formatter: function (value) { return getDicName('payment_way',value); },
                editor: {
                    type: 'combobox',
                    options: {
                        valueField: 'code',
                        textField: 'name',
                        data: getDictList('payment_way'),
                        editable: false
                    }
                }
            },
            {field: 'paymentTime', title: '付款日期',width:'120',
                formatter: function (value) {
                    if (!value) return;
                    return moment(new Date(value)).format('YYYY-MM-DD');
                },
                editor: {
                    type: 'datebox',
                    options: {format: 'yyyy-mm-dd'}
                }
            },
            {field: 'paymentRatio', title: '付款比例',width:'120',
                editor: {
                    type: 'numberbox',
                    options: {min: 0, max: 1, precision: 4} // 比例 0-1
                }
            },
            {field: 'paymentAmount', title: '付款金额',width:'120', editor: {
                    type: 'numberbox',
                    options: {min: 0, precision: 2}
                }},
            {field: 'remark', title: '备注',width:'220', editor: 'text'}
        ]] ,
        //开启编辑
        onClickCell: onClickCellPay,
    });
}

/**
 * 初始化确认回调
 * @param callback 回调函数，返回数据
 */
function confirm(callback) {
    let purchaseDetail = [];
    let paymentDetail = [];
    if ($(el.checkbox_detail).prop('checked')) {
        purchaseDetail = $(el.tbPurchaseDetail).datagrid('getSelections');
        purchaseDetail.forEach(row => {
            row.id = null;
            row.contractId = null;
            row.contractCode = null;
        });
        paymentDetail = $(el.tbPaymentDetail).datagrid('getSelections');
        paymentDetail.forEach(row => {
            row.id = null;
            row.contractId = null;
            row.contractCode = null;
        });
    }
    const result = {
        checkbox: getChangeTypeSaveValue(),
        purchaseDetail: purchaseDetail,
        paymentDetail: paymentDetail
    };

    if (typeof callback === 'function') {
        callback(result);
    }
}

/**
 * 获取变更类型值
 * @returns {string}
 */
function getChangeTypeSaveValue() {
    const changeTypes = [];

    if ($(el.checkbox_detail).prop('checked')) {
        changeTypes.push('01');
    }
    if ($(el.checkbox_right).prop('checked')) {
        changeTypes.push('03');
    }

    return changeTypes.join(',');
}

/**
 * 单元格编辑
 * @param index 行序
 * @param field ID
 */
function onClickCell(index, field) {
    // 步骤1：结束上一个单元格的编辑
    if (endEditing(el.tbPurchaseDetail)) {
        const $dg = $(el.tbPurchaseDetail);
        // 步骤2：校验 index/field 有效性
        const rows = $dg.datagrid('getRows');
        const columns = $dg.datagrid('getColumnFields');
        if (index < 0 || index >= rows.length || !columns.includes(field)) {
            return;
        }
        // 关键：记录全局编辑索引（同时赋值给editor变量）
        window.currentEditIndex = index;
        editor = index; // 修复editor变量未赋值问题

        // 步骤3：调用 editCell（兼容低版本）
        try {
            $dg.datagrid('selectRow', index).datagrid('editCell', {index: index, field: field});
            editIndex = index;
            lastEditTg = $dg;
        } catch (e) {
            // 低版本兜底：用 beginEdit 行编辑模拟
            $dg.datagrid('beginEdit', index);
            // 聚焦编辑器
            var ed = $dg.datagrid('getEditor', {index: index, field: field});
            if (ed && ed.target) $(ed.target).focus();
            editIndex = index;
            lastEditTg = $dg;
        }
    }
}

/**
 * 结束编辑
 * @param dgSelector
 * @returns {boolean}
 */
function endEditing(dgSelector) {
    if (editIndex === undefined) return true;
    const $dg = $(dgSelector || lastEditTg);
    if (!$dg.length) return true;

    // 校验并结束编辑
    try {
        if ($dg.datagrid('validateRow', editIndex)) {
            // 优先结束单元格编辑（高版本）
            if ($.fn.datagrid.methods.endEditCell) {
                $dg.datagrid('endEditCell', {index: editIndex});
            } else {
                // 低版本结束行编辑
                $dg.datagrid('endEdit', editIndex);
            }
            editIndex = undefined;
            lastEditTg = undefined;
            return true;
        } else {
            return false;
        }
    } catch (e) {
        editIndex = undefined;
        lastEditTg = undefined;
        return false;
    }
}

/**
 * 付款表格编辑
 * @param index 行序
 * @param field ID
 */
function onClickCellPay(index, field) {
    if (endEditing(el.tbPaymentDetail)) {
        const $dg = $(el.tbPaymentDetail);
        const rows = $dg.datagrid('getRows');
        const columns = $dg.datagrid('getColumnFields');
        if (index < 0 || index >= rows.length || !columns.includes(field)) {
            return;
        }
        try {
            $dg.datagrid('selectRow', index).datagrid('editCell', {index: index, field: field});
            editIndex = index;
            lastEditTg = $dg;
        } catch (e) {
            $dg.datagrid('beginEdit', index);
            const ed = $dg.datagrid('getEditor', {index: index, field: field});
            if (ed && ed.target) $(ed.target).focus();
            editIndex = index;
            lastEditTg = $dg;
        }
    }
}

/**
 * 付款表格增加行
 */
function addPay(){
    const rows = $(el.tbPaymentDetail).datagrid('getRows');

    // 新增行：仅赋值必要字段，其他字段默认空（避免重复赋值）
    $(el.tbPaymentDetail).datagrid('appendRow', {
        id: 0
    });

    // 新增行后编辑（兼容低版本）
    const newIndex = rows.length;
    try {
        $(el.tbPaymentDetail).datagrid('selectRow', newIndex).datagrid('editCell', {index: newIndex, field: 'paymentStage'});
    } catch (e) {
        $(el.tbPaymentDetail).datagrid('beginEdit', newIndex);
        editIndex = newIndex;
    }
}

/**
 * 付款表格删除行
 */
function delPay() {
    const row = $(el.tbPaymentDetail).datagrid('getSelected');
    if (!row) {
        layer.msg("请选中一条记录");
        return;
    }
    topWin.layer.confirm("是否删除", function (index) {
        const rowIndex = $(el.tbPaymentDetail).datagrid('getRowIndex', row);
        $(el.tbPaymentDetail).datagrid('deleteRow', rowIndex);
        const ds = $(el.tbPaymentDetail).datagrid('getRows');
        let je = 0;
        ds.forEach(function (v,n) {
            je = (je + v.paymentAmount );
            // v.paymentAlreadyAmount = je.toFixed(4) ;
            $(el.tbPaymentDetail).datagrid('updateRow',{index:n,row:ds[n]})
            $(el.tbPaymentDetail).datagrid('refreshRow',n);
        });
        topWin.layer.close(index);
    })
}

/**
 * 同步勾选框状态
 */
function syncCheckboxGroupStatus() {
    const detailChecked = $(el.checkbox_detail).prop('checked');
    const rightChecked    = $(el.checkbox_right).prop('checked');

    // 勾选了 采购/付款 任意一个 → 禁用 权责
    if (detailChecked) {
        $(el.checkbox_right).prop('checked', false).prop('disabled', true);
    } else {
        $(el.checkbox_right).prop('disabled', false);
    }

    // 勾选了 权责 → 禁用 采购 + 付款
    if (rightChecked) {
        $(el.checkbox_detail).prop('checked', false).prop('disabled', true);
    } else {
        $(el.checkbox_detail).prop('disabled', false);
    }
}
