import { ResGetList } from '../protocols/equip/PtlGetList';
import { HeroShared } from './hero';
import { PublicShared } from './public';
// import { PlayerFun } from './player';

export class EquipShared {
    /**
     * 格式化装备数据
     */
    static fmtEquip(equipData: string): {
        lv: number;
        star: number;
        equipId: string;
        adjustment: number;
        _id: string;
    };
    static fmtEquip(equipData: Pick<ResGetList['list'][''], 'equipId' | 'lv' | 'star' | '_id' | 'adjustment'>): string;
    static fmtEquip(equipData: string | Pick<ResGetList['list'][''], 'equipId' | 'lv' | 'star' | '_id' | 'adjustment'>) {
        if (typeof equipData == 'string') {
            let [_id, equipId, lv, star, adjustment] = equipData.split('_');
            return {

                lv: Number(lv),
                _id: _id,
                star: Number(star),
                equipId: equipId,
                adjustment: Number(adjustment || '0')
            };
        } else {
            return [equipData._id, equipData.equipId, equipData.lv, equipData.star, equipData.adjustment || 0].join('_');
        }
    }

    /**
     * 获取装备buff
     */
    static getEquipBuff(equipData: Partial<Pick<ResGetList['list'][''], 'equipId' | 'lv' | 'star' | 'adjustment'>> | string) {
        let equip: Partial<Pick<ResGetList['list'][''], 'equipId' | 'lv' | 'star' | 'adjustment'>>;
        if (typeof equipData == 'string') {
            let [_id, equipId, lv, star, adjustment] = equipData.split('_');
            equip = {
                lv: Number(lv),
                star: Number(star),
                equipId: equipId,
                adjustment: Number(adjustment || '0')
            };
        } else {
            equip = equipData;
        }

        let conf = G.gc.equip[equip.equipId];
        let buff: k_v<number> = {};
        let addBuff: k_v<number> = {};

        Object.assign(buff, conf.buff);

        for (let k in conf.qh) {
            addBuff[k] = PublicShared.eval(conf.qh[k], { qhlv: equip.lv });
        }

        PublicShared.mergeProperty(buff, addBuff);

        if (equip.star && G.gc.equipstar[equip.equipId]) {
            for (let star = 1; star <= equip.star; star++) {
                PublicShared.mergeProperty(buff, G.gc.equipstar[equip.equipId][star].buff);
            }
        }

        if (equip.adjustment) {
            let p = G.gc.equipAdjusting[equip.adjustment].percent;
            for (let k in buff) {
                if (k.indexOf('pro') != -1) continue;
                buff[k] *= 1 + p;
            }
        }

        HeroShared.amendAttr(buff);

        return buff;
    }

    /**
     * 获取装备升级消耗
     */
    static getEquipLvUpNeed(equipData: Partial<Pick<ResGetList['list'][''], 'lv'>> | string): atn[] {
        let equip: Partial<Pick<ResGetList['list'][''], 'lv'>>;
        if (typeof equipData == 'string') {
            let [_id, equipId, lv, star] = equipData.split('_');
            equip = {
                lv: Number(lv)
            };
        } else {
            equip = equipData;
        }

        // let base = equip.lv <= 140 ? 0.6 : parseInt(PublicShared.eval(`(${equip.lv}/120)^3`));
        // let itemFmt = 'ceil(round((2+qhlv+ qhlv/2)/5)*5*base*0.5)';

        // if (equip.lv > 30 && equip.lv <= 140) {
        //     itemFmt = 'round((2+qhlv+ qhlv/2)/5)*5*base*0.5';
        // } else {
        //     itemFmt = 'round((2+qhlv+ qhlv/2)/5)*5*base*0.5';
        // }

        return [
            // { a: 'attr', t: 'jinbi', n: Math.floor(3000 + equip.lv * 80) },
            ...G.gc.equiplvup[equip.lv].need
        ];
    }


    /**
     * 格式化装备等级
     */
    static getFmtEquipLvUp(pos: string, equips: { [id: string]: string }): number {
        let equit = equips[pos]
        let _num = Number(equit.split("_")[2]) || 0

        return _num
    }

    /**
     * 计算快速强化的装备等级与资源消耗
     * heroEquip 装备的对象
     * playerLv 玩家的等级
     */
    static getQuickLvUpNeed(heroEquip, playerLv) {
        let _equip = {};
        let posLvUp = {};
        let allNeed:atn[] = [];
        Object.keys(heroEquip).forEach( x => {
            if(heroEquip[x]) _equip[x] = EquipShared.getFmtEquipLvUp(x, heroEquip)
        })
        for (let i = 1; i <= 10 * Object.keys(_equip).length; i++) {
            // 排序，取等级最低的装备升级
            let _sortPos = Object.keys(_equip).sort((a, b) => _equip[a] - _equip[b])
            const pos = _sortPos[0]
            if (!heroEquip[pos]) continue;
            let equipLv = _equip[pos]
            // let equip = EquipShared.fmtEquip(heroEquip[pos]);
            if (equipLv + 1 > playerLv * 2) continue;
            let need:atn[] = EquipShared.getEquipLvUpNeed({ lv: equipLv + 1 });
            allNeed = allNeed.concat(need);
            if (!posLvUp[pos]) posLvUp[pos] = 0;
            posLvUp[pos]++;
            _equip[pos]++;
        }
        
        let res = { posLvUp, allNeed, log: _equip};
        return res;
    }
}