import { ApiCall } from "tsrpc";
import { CollectionEquip } from '../../module/collection_equip';
import { EquipFun } from '../../public/equip';
import { HeroFun } from '../../public/hero';
import { PlayerFun } from '../../public/player';
import { ReqStarUp, ResStarUp } from "../../shared/protocols/equip/PtlStarUp";
import { ServiceType } from '../../shared/protocols/serviceProto';
import { EquipShared } from '../../shared/public/equip';
import { md_redPoint_check } from '../gongyu/mingdao/ApiOpen';
import { PublicShared } from "../../shared/public/public";

export default async function (call: ApiCall<ReqStarUp, ResStarUp, ServiceType>) {

    let equip = await EquipFun.getEquip(call, call.req.equipId);

    if (!equip) return call.error(globalThis.lng.equip_1);
    if (!G.gc.equipstar[equip.equipId]) return call.error(globalThis.lng.equip_4);
    if (!G.gc.equipstar[equip.equipId][equip.star + 1]) return call.error(globalThis.lng.equip_5);

    let need = G.gc.equipstar[equip.equipId][equip.star + 1].need;
    let needItem = need.filter(v => v.a != 'equip');
    let needEquip = need.filter(v => v.a == 'equip');

    await PlayerFun.checkNeedIsMeet(call, needItem);

    if (needEquip.length > 0) {
        let equipArr: CollectionEquip[] = [];

        for (let _id of call.req.equipArr) {
            //遍历客户端传过来的所有装备，如果不存在或处于穿戴中，则报错
            let equip = await EquipFun.getEquip(call, _id);
            if (!equip) return call.error(globalThis.lng.equip_6);
            if (equip.wearaId) return call.error(globalThis.lng.equip_7);
            equipArr.push(equip);
        }

        let check = needEquip.map(v => {
            return new Array(v.n).fill(1).map(v1 => {
                return v.t;
            });
        }).reduce((a, b) => a.concat(b));

        // 选择装备数量不对
        if (check.length != equipArr.length) return call.error('', { code: -1, message: globalThis.lng.equip_starup_1 });

        let val1 = PublicShared.eval(check.join('+'));
        let val2 = PublicShared.eval(equipArr.map(e => e.equipId).join('+'));

        if (val1 != val2) return call.error(globalThis.lng.equip_8);

        await PlayerFun.cutEquip(call, call.req.equipArr);
    }

    await PlayerFun.cutNeed(call, needItem);
    await EquipFun.changeEquipAttr(call, equip, { star: equip.star + 1 });

    if (equip.star == 5) md_redPoint_check(call.conn, 'equip_star_5');

    if (equip.wearaId) {
        let hero = await HeroFun.getHero(call, equip.wearaId)
        if (hero) {
            hero.equip[G.gc.equip[equip.equipId].type] = EquipShared.fmtEquip(equip);
            await HeroFun.changeHeroAttr(call, hero, { equip: hero.equip });
        }
    }

    call.succ({});
} 
