import { ApiCall } from "tsrpc";
import { FightFun } from '../../public/fight';
import { PlayerFun } from '../../public/player';
import { ReqFight, ResFight } from "../../shared/protocols/ganhai/PtlFight";
import { prizeType } from '../../shared/protocols/type';
import { HongDianChange } from "../hongdian/fun";

export default async function (call: ApiCall<ReqFight, ResFight>) {
    let dbData = await G.mongodb.collection('ganhai').findOne({ uid: call.uid });
    let index = call.req.index;
    let fightNum = dbData.useFightNum + 1;
    let toShipUid = dbData.ships[index]?.player?.player?.uid;
    let toShip
    if(toShipUid){
        toShip = (await G.mongodb.collection('ganhai').findOne({ uid: toShipUid })).ship;
    }

    if (fightNum > G.gc.ganhai.fightNum) return call.error('', { code: -1 });
    if (!toShip) return call.error('', { code: -2 });
    if (toShip.beFightNum >= G.gc.ganhai.ships[toShip.index].ldNum) return call.error('', { code: -3 });

    G.mongodb.collection('ganhai').updateOne({ uid: call.uid }, { $set: { ships: dbData.ships, useFightNum: fightNum } });

    let change: ResFight['change'] = {
        useFightNum: fightNum,
        ships: dbData.ships
    };
    let result = FightFun.fight([await call.conn.getDefaultFightData(), toShip.player]);
    result.otherData = { shipIndex: toShip.index };

    FightFun.saveLog(call.uid, 'ganhai', result);
    FightFun.saveLog(toShip.player.player.uid, 'ganhai', {...result,winSide:result.winSide?0:1});

    let prize: prizeType[] = [];

    if (result.winSide == 0) {
        // 我方胜利加1
        toShip.beFightNum++;
        G.mongodb.collection('ganhai').updateOne({ uid: toShip.player.player.uid }, { $inc: { 'ship.beFightNum': 1 } });

        let conf = G.gc.ganhai.ships[toShip.index];
        prize = conf.prize.slice(1).map(atn => ({ ...atn, n: Math.floor(atn.n * conf.ldRatio) }));
        await PlayerFun.sendPrize(call, prize);
    }

    HongDianChange.sendChangeKey(call.uid, ['gonghuihd']);
    call.succ({
        prize: prize,
        result: result,
        change: change
    });
}