class SkuUtils {
// 全局变量，存储最终结果
constructor(){
  this.arrSku = [];//获取到的sku数据
  this.arrSkuCombination = [];//按顺序获取所有SKU组合{sku:sku组合, dom:价格输入框DOM, value:价格输入框的值}
  this.right = window.skuPricingModalRight;//右侧表格数据
}

/**
 * 滚动容器函数
 * @param {*} x 水平滚动距离
 * @param {*} y 垂直滚动距离
 * @param {*} time 每次滚动等待时间（毫秒）
 * @param {*} flag 0 什么都不操作，1 获取表格数据，2 修改输入框值
 * @param {*} skuData sku数据 [{skuName: sku名称, value: 推荐价格}]
 * @returns 
 */
async scrollContainerOperation(x, y, time, flag, skuData) {
    if (flag == 2 && !skuData) {
        if (window.AlertUtils) {
            window.AlertUtils.alert('请选择SKU并进行数据核算', 'error');
        } else {
            alert('请选择SKU并进行数据核算');
        }
        return;
    }
    
    let divscroll = document.querySelector("div.ver-scroll-wrap");
    if (!divscroll) {
        return;
    }
    
    let scrollCount = 0;
    
    // 记录初始滚动位置
    const initialScrollTop = divscroll.scrollTop;
    

    let waitingTime = time;
    // while (true) {
    for (let i = 0; i < 200; i++) {
        if (x !== 0) {
            divscroll.scrollLeft += x;
        }
        // 检查是否到达底部
        const isAtBottom = divscroll.scrollTop + divscroll.clientHeight >= divscroll.scrollHeight - 5;
        
        
        
        // 安全限制，防止无限滚动
        if (scrollCount > 200) {
            if (window.AlertUtils) {
                window.AlertUtils.alert('滚动次数过多，可能出现异常，已停止滚动,请将问题反馈给管理员。', 'error');
            } else {
                alert('滚动次数过多，可能出现异常，已停止滚动,请将问题反馈给管理员。');
            }
            break;
        }

        let tableRowData = await this.getTableData();
        
        if (flag === 2) {
            await this.setSkuInputValue(tableRowData, skuData, scrollCount);
        }else{

            // 等待指定时间
            await new Promise(resolve => setTimeout(resolve, time));
        }
        scrollCount++;                           
        
        // 滚动到指定位置
        
        divscroll.scrollTop += y;

                

        if (isAtBottom) {
            break;
        }
    }
    
}

/**
 * 设置SKU输入框值
 * @param {*} tableRowData 表格数据
 * @param {*} skuData SKU数据 [{skuName: sku名称, value: 推荐价格}]
 * @param {*} waitingTime 等待时间（毫秒）
 */
  async setSkuInputValue(tableRowData, skuData, scrollCount){ 
    let start = new Date().getTime();
    let time = 200;

    let setTimeoutTime = 20;
    


     
    await new Promise(resolve => {
       const interval = setInterval(() => {
        // 过滤出未设置值的行
        let filterTableRowData = tableRowData.filter(item=>{
            let value = item.dom.value;
            let sku = skuData.find(s=>s.skuName === item.sku);
            if(sku ){
                if(!value || sku?.value != value){
                    return item;
                }
            }
        });
        if(filterTableRowData.length === 0){
            clearInterval(interval);
            resolve();
        }
        // 如果有未设置值的行，重置time时间 为 未设置值的行数 + 1.5 倍的 setTimeoutTime
        if(filterTableRowData.length != tableRowData.length){
            time = (filterTableRowData.length + 2) * setTimeoutTime;
        }
        let i = 0;  
        
        for (let row of filterTableRowData) {
            let sku = skuData.find(item=>item.skuName === row.sku);
            if (!sku) {
                return '';
            }
            i++;
           
    
            // window.setTimeout(()=>{
            //     window.reactUtils.setReactInputValue(row.dom, sku.value);
            //     filterTableRowData[0].dom.focus();
            //     console.log(`设置SKU: ${row.sku} 值为: ${row.dom.value}`);
            // },i * setTimeoutTime);    

                window.reactUtils.setReactInputValue(row.dom, sku.value);
                row.dom.focus({preventScroll: true});

        }
        

        }, time);
    });

    let end = new Date().getTime();
    return time;
}

// 方法2: 获取表格数据
/**
 * 获取表格数据
 * @returns 表格数据
 */
async getTableData() {
    let startTimeStamp = new Date().getTime();
    // 获取整个表格元素
    let divLocked = document.querySelector("div.locked-table-addon");
    let table = divLocked?.querySelector('table');

    let divscroll = document.querySelector("div.ver-scroll-wrap");
    let trs = divscroll.querySelectorAll("tr.sku-table-row ");
    if (!table) {
        alert('未找到SKU表格元素，请联系管理员');
        return;
    }
    
    // 步骤1：提取表头数据（title属性值）
    let thElements = table.querySelectorAll('thead .sell-sku-head-cell');
    let headers = Array.from(thElements).map(th => th.title);
    let tempSku = [...headers];
    
    // 如果是第一次调用，初始化结果数组
    if (this.arrSku.length === 0) {
        headers.forEach((header, index) => {
            this.arrSku.push({
                id: index,
                name: header,
                values: []
            });
        });
    }
    
    // 步骤2：提取表体数据并去重填充到对应列
    let tbody = table.querySelector('tbody');
    let rows = tbody.querySelectorAll('.sku-table-row');
    let lenArrSku = this.arrSku.length - 1;

    let tableRowData = [];
    
    rows.forEach((row, index) => {
        let cells = row.querySelectorAll('td');
        let lenCells = cells.length - 1;

        
        
        // 倒序插入sku值，规避前面n列没有值的问题
        for(let i = 0; i < cells.length; i++){
            let cellContent = cells[lenCells - i].querySelector('.ae-sku-cell-text-content')?.title || '';
            if (cellContent && !this.arrSku[lenArrSku - i].values.includes(cellContent)) {
                this.arrSku[lenArrSku - i].values.push(cellContent);
            }

            //给SKU组合添加当前值
            tempSku[lenArrSku - i] = cellContent;
        }
        // 把当前SKU组合添加到结果数组
        if(!tableRowData.map(item => item.sku).includes(tempSku.toString())){

            //获取当前SKU组合的价格输入框
            let domInput = trs[index].querySelector('td.col-skuPrice').querySelector('input');
            tableRowData.push(
                {sku:tempSku.toString().replaceAll(',','-'), dom:domInput, value: 6666}
            );
        }
    });
    
    let endTimeStamp = new Date().getTime();
    return tableRowData;
}

// 组合方法：滚动并获取数据
/**
 * 滚动并提取表格数据
 * @param {*} y 垂直滚动距离
 * @param {*} time 每次滚动等待时间（毫秒）
 * @returns 表格数据
 */
async scrollAndExtractData(x, y, time) {
    this.resetArrSku();
    let startTime = new Date().getTime();

    this.scrollToTop();
    // 先获取一次初始数据
     this.getTableData();
    
    // 开始滚动
    await this.scrollContainerOperation(x, y, time, 1);

    
    // 滚动完成后再次获取数据
    this.getTableData();

    this.scrollToTop();
    
    // 统计总数据量
    let totalValues = 0;
    this.arrSku.forEach(item => {
        totalValues += item.values.length;
    });
    
    let endTime = new Date().getTime();
    return this.arrSku;
}

/**
 * 滚动并设置输入框值
 * @param {*} x 水平滚动距离
 * @param {*} y 垂直滚动距离
 * @param {*} time 每次滚动等待时间（毫秒）
 * @param {*} skuData SKU数据
 */
async scrollAndSetInputValue(x, y, time, skuData) {
    let startTime = new Date().getTime();
    await this.scrollContainerOperation(x, y, time, 2, skuData);
    this.scrollToTop();
    await this.scrollContainerOperation(x, y, time, 2, skuData);
    await this.scrollContainerOperation(x, y, time, 2, skuData);

}

//滚回顶部
scrollToTop() {
    let divscroll = document.getElementById("sale-card").querySelector("div.ver-scroll-wrap");
    divscroll.scrollTop = 0;
}

// 重置结果
resetArrSku() {
    this.arrSku = [];
}

}

window.skuUtils = new SkuUtils();