import { TD, app } from "../../../App";
import { TbGEntity } from "../../../config/data/schema";
import { PetEquip, PlayerPetOV } from "../../../consts/API";
import GRoleValues from "./GRoleValues";
import GAttribute from "./attribute/GAttribute";
import GDefaultAttribute from "./attribute/default/GDefaultAttribute";
import GPetAttribute from "./attribute/role/GPetAttribute";
import GPetEquipAttribute from "./attribute/role/GPetEquipAttribute";

//战斗传入数据
export interface GBattleDataInfo{
    //宠物
    pets?:PlayerPetOV[],
    //宠物装备
    petEquips?:PetEquip[]
}

export enum GBattleDataEnum{
    UPDATE = "GBattleData_UPDATE"
}

//战斗数据类
export default class GAttributeData{

    info:GBattleDataInfo;
    isEmit:boolean;

    constructor(info:GBattleDataInfo = {},isEmit:boolean = false){
        this.isEmit = isEmit;
        this.update(info);
    }

    update(info:GBattleDataInfo){
        //初始化数据
        info.pets = info.pets || [];
        info.petEquips = info.petEquips || [];
        this.info = info;
        if(this.isEmit)
            app.event.emit(GBattleDataEnum.UPDATE)
    }

    assets(info:GBattleDataInfo){
        Object.assign(this.info,info);
        if(this.isEmit)
            app.event.emit(GBattleDataEnum.UPDATE)
    }

    //计算总战力数值
    getAllFC(){
        let fc = 0;
        Object.values(this.info.pets).forEach(pet => {
            let attribute = this.getPetAttribute(pet.petId);
            //计算战力
            fc += GAttributeData.FC(attribute);
        })
        return fc;
    }

    //获取共享属性

    //获取指定宠物的属性
    getPetAttribute(petId:number){
        let pet = this.info.pets.filter(item => item.petId == petId)[0];
        if(!pet) return new GAttribute();

        let value = new GAttribute();
        value.add(new GPetAttribute(pet));
        value.add(new GPetEquipAttribute(this.info.petEquips.filter(item => item.equipPetId == petId)));
        value.update();

        return value;

    }

    //根据属性计算战力
    static FC(info:GAttribute){

        let fc = 0;

        TD.TbGAttribute.getDataList().forEach(item => {
            let value = info.info[item.id] || 0;
            fc += TD.TbGAttributeFC.get(item.id).value * value;
        })

        return fc;
        
    }

    //根据属性返回属性
    static TAttributeValue(info:TbGEntity.TAttributeValue[]){

        let value = new GAttribute();
        value.add(new GDefaultAttribute().set(info))
        return value;

    }

}