// 辅助函数
const getMax = (temp, tempA, tempB, tempC) => {
    temp = temp > tempA ? temp : tempA
    temp = temp > tempB ? temp : tempB
    if (tempC !== undefined) {
        temp = temp > tempC ? temp : tempC
    }
    return temp
}

const getMaxTwo = (temp, tempA, tempB) => {
    temp = temp > tempA ? temp : tempA
    temp = temp > tempB ? temp : tempB
    return temp
}

const getMin = (temp, tempA, tempB, tempC) => {
    temp = temp < tempA ? temp : tempA
    temp = temp < tempB ? temp : tempB
    if (tempC !== undefined) {
        temp = temp < tempC ? temp : tempC
    }
    return temp
}

const getMinOpen = (temp, tempA, tempB) => {
    temp = temp < tempA ? temp : tempA
    temp = temp < tempB ? temp : tempB
    return temp
}

// 数据处理函数
const fliteWaveData = (wp, step, iphasicValue, isOpen) => {
    const rmsData = wp.listRmsData
    const pt = Number(wp.pt) / 1000
    const ct = Number(wp.ct)
    const titleList = wp.waveTitle
    let xishu = pt
    let aTitle = '',
        bTitle = '',
        cTitle = '',
        unit = '电压'
    let rmsvFirstX = 0,
        rmsvFirstY = 0,
        rmsvSecondX = 0,
        rmsvSecondY = 0,
        firstZhou = 'a',
        secondeZhou = 'a'
    let ifmax = 0,
        ifmin = 0,
        ismax = 0,
        ismin = 0,
        rfmax = 0,
        rfmin = 0,
        rsmax = 0,
        rsmin = 0

    const shunshiFA = []
    const shunshiFB = []
    const shunshiFC = []
    const shunshiSA = []
    const shunshiSB = []
    const shunshiSC = []
    const rmsFA = []
    const rmsFB = []
    const rmsFC = []
    const rmsSA = []
    const rmsSB = []
    const rmsSC = []

    if (titleList[iphasicValue * step + 1]?.substring(0, 1) !== 'U') {
        xishu = ct
        unit = '电流'
    }

    for (let i = 1; i <= iphasicValue; i++) {
        switch (i) {
            case 1:
                aTitle = titleList[iphasicValue * step + i]?.substring(1) || ''
                break
            case 2:
                bTitle = titleList[iphasicValue * step + i]?.substring(1) || ''
                break
            case 3:
                cTitle = titleList[iphasicValue * step + i]?.substring(1) || ''
                break
        }
    }

    if (rmsData[0] && rmsData[0][iphasicValue * step + 1] !== undefined) {
        rfmax = rmsData[0][iphasicValue * step + 1] * xishu
        rfmin = rmsData[0][iphasicValue * step + 1] * xishu
        rmsvFirstY = rmsData[0][iphasicValue * step + 1] * xishu
        rmsvFirstX = rmsData[0][0]
        rsmax = rmsData[0][iphasicValue * step + 1]
        rsmin = rmsData[0][iphasicValue * step + 1]
        rmsvSecondY = rmsData[0][iphasicValue * step + 1]
        rmsvSecondX = rmsData[0][0]
    }

    for (let rms = 0; rms < rmsData.length; rms++) {
        if (!rmsData[rms] || rmsData[rms][iphasicValue * step + 1] === undefined) {
            break
        }

        switch (iphasicValue) {
            case 1:
                const rmsFirstA = rmsData[rms][iphasicValue * step + 1] * xishu
                rmsFA.push([rmsData[rms][0], rmsFirstA])
                rfmax = rfmax > rmsFirstA ? rfmax : rmsFirstA
                rfmin = rfmin < rmsFirstA ? rfmin : rmsFirstA
                if (rfmin < rmsvFirstY) {
                    rmsvFirstY = rfmin
                    firstZhou = 'a'
                    rmsvFirstX = rmsData[rms][0]
                }

                const rmsSecondA = rmsData[rms][iphasicValue * step + 1]
                rmsSA.push([rmsData[rms][0], rmsSecondA])
                rsmax = rsmax > rmsSecondA ? rsmax : rmsSecondA
                rsmin = rsmin < rmsSecondA ? rsmin : rmsSecondA
                if (rsmin < rmsvSecondY) {
                    rmsvSecondY = rsmin
                    secondeZhou = 'a'
                    rmsvSecondX = rmsData[rms][0]
                }
                break
            case 2:
                const rmsFirstA2 = rmsData[rms][iphasicValue * step + 1] * xishu
                const rmsFirstB2 = rmsData[rms][iphasicValue * step + 2] * xishu
                rmsFA.push([rmsData[rms][0], rmsFirstA2])
                rmsFB.push([rmsData[rms][0], rmsFirstB2])
                rfmax = getMaxTwo(rfmax, rmsFirstA2, rmsFirstB2)
                rfmin = getMinOpen(rfmin, rmsFirstA2, rmsFirstB2)
                if (rfmin < rmsvFirstY) {
                    rmsvFirstY = rfmin
                    if (rfmin === rmsFirstA2) {
                        firstZhou = 'a'
                    } else if (rfmin === rmsFirstB2) {
                        firstZhou = 'b'
                    }
                    rmsvFirstX = rmsData[rms][0]
                }

                const rmsSecondA2 = rmsData[rms][iphasicValue * step + 1]
                const rmsSecondB2 = rmsData[rms][iphasicValue * step + 2]
                rmsSA.push([rmsData[rms][0], rmsSecondA2])
                rmsSB.push([rmsData[rms][0], rmsSecondB2])
                rsmax = getMaxTwo(rsmax, rmsSecondA2, rmsSecondB2)
                rsmin = getMinOpen(rsmin, rmsSecondA2, rmsSecondB2)
                if (rsmin < rmsvSecondY) {
                    rmsvSecondY = rsmin
                    if (rsmin === rmsSecondA2) {
                        secondeZhou = 'a'
                    } else if (rsmin === rmsSecondB2) {
                        secondeZhou = 'b'
                    }
                    rmsvSecondX = rmsData[rms][0]
                }
                break
            case 3:
                const rmsFirstA3 = rmsData[rms][iphasicValue * step + 1] * xishu
                const rmsFirstB3 = rmsData[rms][iphasicValue * step + 2] * xishu
                const rmsFirstC3 = rmsData[rms][iphasicValue * step + 3] * xishu
                rmsFA.push([rmsData[rms][0], rmsFirstA3])
                rmsFB.push([rmsData[rms][0], rmsFirstB3])
                rmsFC.push([rmsData[rms][0], rmsFirstC3])
                rfmax = getMax(rfmax, rmsFirstA3, rmsFirstB3, rmsFirstC3)
                rfmin = isOpen
                    ? getMinOpen(rfmin, rmsFirstA3, rmsFirstC3)
                    : getMin(rfmin, rmsFirstA3, rmsFirstB3, rmsFirstC3)
                if (rfmin < rmsvFirstY) {
                    rmsvFirstY = rfmin
                    if (rfmin === rmsFirstA3) {
                        firstZhou = 'a'
                    } else if (rfmin === rmsFirstB3) {
                        firstZhou = 'b'
                    } else {
                        firstZhou = 'c'
                    }
                    rmsvFirstX = rmsData[rms][0]
                }

                const rmsSecondA3 = rmsData[rms][iphasicValue * step + 1]
                const rmsSecondB3 = rmsData[rms][iphasicValue * step + 2]
                const rmsSecondC3 = rmsData[rms][iphasicValue * step + 3]
                rmsSA.push([rmsData[rms][0], rmsSecondA3])
                rmsSB.push([rmsData[rms][0], rmsSecondB3])
                rmsSC.push([rmsData[rms][0], rmsSecondC3])
                rsmax = getMax(rsmax, rmsSecondA3, rmsSecondB3, rmsSecondC3)
                rsmin = isOpen
                    ? getMinOpen(rsmin, rmsSecondA3, rmsSecondC3)
                    : getMin(rsmin, rmsSecondA3, rmsSecondB3, rmsSecondC3)
                if (rsmin < rmsvSecondY) {
                    rmsvSecondY = rsmin
                    if (rsmin === rmsSecondA3) {
                        secondeZhou = 'a'
                    } else if (rsmin === rmsSecondB3) {
                        secondeZhou = 'b'
                    } else {
                        secondeZhou = 'c'
                    }
                    rmsvSecondX = rmsData[rms][0]
                }
                break
        }
    }

    const instantF = { max: ifmax, min: ifmin }
    const instantS = { max: ismax, min: ismin }
    const RMSF = { max: rfmax, min: rfmin }
    const RMSS = { max: rsmax, min: rsmin }
    const RMSFMinDetail = { rmsvFirstX, rmsvFirstY, firstZhou }
    const RMSSMinDetail = { rmsvSecondX, rmsvSecondY, secondeZhou }
    const shunshiF = { shunshiFA, shunshiFB, shunshiFC }
    const shunshiS = { shunshiSA, shunshiSB, shunshiSC }
    const RMSFWave = { rmsFA, rmsFB, rmsFC }
    const RMSSWave = { rmsSA, rmsSB, rmsSC }
    const title = { aTitle, bTitle, cTitle, unit }

    return {
        instantF,
        instantS,
        RMSF,
        RMSS,
        RMSFMinDetail,
        RMSSMinDetail,
        shunshiF,
        shunshiS,
        RMSFWave,
        RMSSWave,
        title,
        unit
    }
}

// 监听消息
self.onmessage = function (e) {
    const { wp, isOpen, value, boxoList, requestId } = e.data

    try {
        const iphasicValue = wp.iphasic || 1

        const picCounts = (wp.waveTitle.length - 1) / iphasicValue
        const waveDatas = []

        for (let i = 0; i < picCounts; i++) {
            const data = fliteWaveData(wp, i, iphasicValue, isOpen, boxoList)
            waveDatas.push(data)
        }
        // 处理标题
        let titles = ''
        if (boxoList.systemType == 'pms') {
            titles =
                '变电站名称:' +
                boxoList.powerStationName +
                '　监测点名称:' +
                boxoList.measurementPointName +
                '　发生时刻:' +
                boxoList.startTime +
                '　暂降幅值:' +
                 Math.floor(boxoList.featureAmplitude * 10000) / 100  +
                '% 　持续时间:' +
                boxoList.duration +
                's'
        } else if (boxoList.systemType == 'ZL') {
            titles =
                (boxoList.engineeringName == undefined ? '' : ' 项目名称:' + boxoList.engineeringName) +
                '　监测点名称:' +
                boxoList.equipmentName +
                '　发生时刻:' +
                boxoList.startTime +
                '　暂降幅值:' +
                boxoList.evtParamVVaDepth +
                '%　持续时间:' +
                boxoList.evtParamTm +
                's'
        } else if (boxoList.systemType == 'YPT') {
            titles =
                (boxoList.engineeringName == undefined ? '' : ' 项目名称:' + boxoList.engineeringName) +
                '　监测点名称:' +
                boxoList.lineName +
                '　发生时刻:' +
                boxoList.startTime +
                '　暂降幅值:' +
                 Math.floor(boxoList.featureAmplitude * 10000) / 100  +
                '%　持续时间:' +
                boxoList.persistTime +
                's'
        } else {
            titles =
                '　变电站名称:' +
                boxoList.subName +
                '　监测点名称:' +
                boxoList.lineName +
                '　发生时刻:' +
                boxoList.startTime +
                '　暂降幅值:' +
                 Math.floor(boxoList.featureAmplitude * 10000) / 100  +
                '%　持续时间:' +
                boxoList.duration +
                's'
        }
        // 发送处理结果回主线程
        self.postMessage({
            requestId,
            titles: titles,
            success: true,
            waveDatas,
            time: wp.time,
            type: wp.waveType,
            severity: wp.yzd,
            iphasic: iphasicValue
        })
    } catch (error) {
        self.postMessage({
            requestId,
            success: false,
            error: error.message
        })
    }
}
