import {ApiCall} from "tsrpc";
import {RedisCollections2} from '../../module/redis';
import {ReqGetList, ResGetList} from "../../shared/protocols/hero/PtlGetList";
import {PeijianShared} from "../../shared/public/peijian";

export default async function (call: ApiCall<ReqGetList, ResGetList>) {
    let list: ResGetList['list'] = {};
    //let kvList: k_v<RedisCollections2['hero']> = {};
    let arrList = await G.mongodb.collection('hero').find({uid: call.uid}).toArray();

    let heroCon = G.gc.hero;
    let color = {};
    let maxherolv = 0;
    arrList.forEach(v => {
        let d = G.mongodb.conversionIdObj(v);
        //kvList[G.formatRedisKey(d._id)] = d;
        list[d._id] = d;

        if (v.lv > maxherolv) maxherolv = v.lv;
        if (!color[heroCon[v.heroId].colour]) color[heroCon[v.heroId].colour] = 0;
        color[heroCon[v.heroId].colour] += 1;
    });

    await checkDataAndFix(call, list)

    // 记录玩家最大等级，颜色相关数据 注册任务用
    await G.mongodb.collection('playerInfo', 'usertasklog').updateOne({uid: call.conn.uid, type: 'usertasklog'},
        {$set: {maxherolv: maxherolv, herocolor: color}}, {upsert: true});

    let recLshd = await G.mongodb.collection('playerInfo', 'lshd_hero').findOne({
        uid: call.conn.uid,
        type: 'lshd_hero'
    });
    let {uid, _id, type, ...heros} = (recLshd || {});


    call.conn.lshd.hero = heros || {};
    call.succ({
        list: list,
        pos: call.conn.heroPos,
        lshd: heros || {},
        gbzj: (await G.mongodb.cPlayerInfo('gbzj').findOne({uid: call.uid, type: 'gbzj'}))?.rec || {}
    });
}

/**
 * 修复玩家出现的饰品和配件数据错误导致的进不去游戏
 * @param call
 * @param list
 */
async function checkDataAndFix(call: ApiCall, list: ResGetList['list']) {
    try {
        // 修复配件数据
        let peijianids = [];
        Object.values(list).map(hero => {
            hero.peijian && Object.values(hero.peijian).map(
                i => peijianids.push(G.mongodb.conversionId(PeijianShared.fmt(i)._id))
            )
        });

        let peijians = (await G.mongodb.collection("peijian").find(
            {uid: call.uid, _id: {$in: peijianids}}, {projection: {_id: 1}}
        ).toArray()).map(temp => G.mongodb.conversionId(temp._id));

        let shiwuIds = R.flatten(R.values(list).map(hero => R.values(hero.shiwu).map(i => G.mongodb.conversionId(i._id))))

        let shiwus = (await G.mongodb.collection("shiwu").find(
            {uid: call.uid, _id: {$in: shiwuIds}}, {projection: {_id: 1}}
        ).toArray()).map(i => G.mongodb.conversionId(i._id));

        let peijianChanges = {};
        let shiwuChanges = {};
        Object.values(list).map(hero => {
            for (let pos in hero.peijian) {
                if (!peijians.includes(PeijianShared.fmt(hero.peijian[pos])._id)) {
                    hero.peijian[pos] = "";
                    peijianChanges[hero._id] = hero.peijian;
                }
            }
            for (let pos in hero.shiwu) {
                if (!shiwus.includes(hero.shiwu[pos]._id)) {
                    hero.shiwu = R.omit([pos], hero.shiwu)
                    shiwuChanges[hero._id] = hero.shiwu;
                }
            }
        })

        for (let oid in peijianChanges) {
            // 修复数据
            G.mongodb.collection("hero").updateOne(
                G.mongodb.conversionIdObj({_id: oid}), {$set: {peijian: peijianChanges[oid]}}
            )
        }

        for (let oid in shiwuChanges) {
            // 修复数据
            G.mongodb.collection("hero").updateOne(
                G.mongodb.conversionIdObj({_id: oid}), {$set: {shiwu: shiwuChanges[oid]}}
            )
        }
    } catch (e) {
        console.log('======修复英雄配件和饰物报错====',e)
    }
}