import {ApiCall} from "tsrpc";
import {Wjjl} from '../../module/collection_wjjl';
import {PlayerFun} from '../../public/player';
import {ReqChangePos, ResChangePos} from "../../shared/protocols/hero/PtlChangePos";
import kfjsFun from "../../public/kaifujingsai";
import {HeroFun} from "../../public/hero";


export const maxPosNum = 6;

export default async function (call: ApiCall<ReqChangePos, ResChangePos>) {
    let hero = await HeroFun.getHero(call, call.req.id)
    if (!hero) return call.error(globalThis.lng.hero_1);

    let heroPos = Object.assign({}, call.conn.heroPos);
    let fightHeros = call.conn.gud.fightHeros.map(id => id);
    let posArr = Object.keys(heroPos).filter(pos => call.conn.gud.lv >= G.gc.herocom.szHeroLimit[pos]);
    let idArr = Object.values(heroPos).filter(v => v != '');

    if (call.conn.gud.helpHeros.find(v => v._id == call.req.id)) return call.error('', {code: -1});
    if (idArr.includes(call.req.id)) return call.error(globalThis.lng.hero_2);
    if (call.req.pos && !posArr.includes(call.req.pos)) return call.error(globalThis.lng.hero_3);

    let matrixPos = JSON.parse(JSON.stringify(call.conn.gud.matrixPos));

    if (call.req.state == 'set') {
        if (idArr.length == posArr.length) return call.error(posArr.length < maxPosNum ? globalThis.lng.hero_5 : globalThis.lng.hero_4);
        if (fightHeros.includes(hero.heroId.toString())) return call.errorCode(-2);
        let setPos = call.req.pos;
        heroPos[setPos] = call.req.id;

        for (let type in matrixPos) {
            if (!matrixPos[type][setPos]) matrixPos[type][setPos] = call.req.id;
            // else {
            //     for (let pos = 1; pos <= maxPosNum; pos++) {
            //         if (!matrixPos[type][pos]) matrixPos[type][pos] = call.req.id;
            //     }
            // }
        }
    } else if (call.req.state == 'change') {
        if (heroPos[call.req.pos]) {
            let unLoadHero = await HeroFun.getHero(call, heroPos[call.req.pos]);
            unLoadHero && fightHeros.removeOne(id => id == unLoadHero.heroId);
        }
        if (fightHeros.includes(hero.heroId.toString())) return call.errorCode(-2);

        // todo 替换逻辑有问题
        for (let type in matrixPos) {
            for (let pos in matrixPos[type]) {
                if (pos == call.req.pos) {
                    matrixPos[type][pos] = call.req.id;
                }
            }
        }

        heroPos[call.req.pos] = call.req.id;
    }
    fightHeros.push(hero.heroId.toString());

    fightHeros = await checkFightHerosAndFix(call.uid, heroPos, fightHeros)

    Wjjl.setVal(call.uid, 'fight_hero_colour_4', fightHeros.map(id => G.gc.hero[id].colour).filter(c => c >= 4).length);

    let checkMatrixPos = HeroFun.checkMatrixPosAndChange(call, heroPos, matrixPos)
    await PlayerFun.addAttr(call, {heroPos: heroPos, fightHeros: fightHeros, matrixPos: checkMatrixPos});
    call.succ(heroPos);

    call.conn.refreshPower();
    kfjsFun.setHeroLvCount(call)
}

async function checkFightHerosAndFix(uid, heroPos, fightHeros) {
    if (fightHeros.length == R.values(heroPos).length) {
        return fightHeros
    }
    let heros = await HeroFun.getHeros({uid}, R.values(heroPos));
    return heros.map(i => i.heroId)
}