import { app } from "../App";
import { API, PlayerInfoOV, PlayerPetOV } from "../consts/API";
import BaseData from "./BaseData";
import PlayerTacticalData from "./PlayerTacticalData";
import { ResourceUpdateType } from "./ResourceData";

export enum PlayerPetEvent{
    UPDATE = "PlayerPetEvent_UPDATE",               //刷新宠物
    UPDATE_INFO = "PlayerPetEvent_UPDATE_INFO",     //刷新宠物信息
    UPDATE_ADD = "PlayerPetEvent_UPDATE_ADD",      //添加宠物
    UPDATE_MINUS = "PlayerPetEvent_UPDATE_MINUS",      //减少宠物
}

//玩家宠物数据
export default class PlayerPetData extends BaseData{

    //玩家宠物列表
    datas:PlayerPetOV[] = [];

    async onInit() {

        //更新玩家宠物
        await this.UpdatePlayerPet();

    }

    //获取全部宠物
    getData():PlayerPetOV[]{
        return this.datas;
    }

    //获取指定宠物
    getPetIdData(petTbId:number,datas:PlayerPetOV[] = this.datas):PlayerPetOV[]{
        return datas.filter(data => data.petTbId == petTbId);
    }

    //获取未上阵的宠物
    getNoTacticalData():PlayerPetOV[]{
        return this.datas.filter(data => PlayerTacticalData.getIns().getTacticalInfo().indexOf(data.petId) < 0);
    }

    //更新玩家宠物
    async UpdatePlayerPet(){
        //获取全部宠物
        this.datas = await API.GetPlayerPets();
    }

    //选择宠物
    async SelectNovicePet(petId:number){
        await API.SelectNovicePet(petId);
        //更新玩家宠物列表
        await this.UpdatePlayerPet();
    }

    //通过宠物Id找到宠物
    petIdQueryPetInfo(petId:number):PlayerPetOV{
        return this.datas.filter(item => item.petId == petId)[0]
    }

    //添加宠物
    addPet(pet:PlayerPetOV){
        this.datas.push(pet);
    }

    //刷新返回宠物
    onUpdateOV(operation:number,resource:PlayerPetOV){

        //如果没有刷新的宠物 则 返回
        if(!resource) return;

        if(operation == ResourceUpdateType.UPDATE){
            //更新资源
            //找到需要被刷新的宠物 然后刷新 找不到则添加
            let pet = this.datas.filter(pet => pet.petId == resource.petId)[0];
            if(pet){
                //更新数据
                Object.assign(pet,resource);
                app.event.emit(PlayerPetEvent.UPDATE_INFO,pet)
            }else{
                operation = ResourceUpdateType.ADD;
                this.onUpdateOV(operation,resource);
            }
        }else if(operation == ResourceUpdateType.ADD){
            //查询如果没有这个宠物则添加 负责 刷新
            let pet = this.datas.filter(pet => pet.petId != resource.petId)[0];
            if(!pet){
                //没有则添加
                this.datas.push(resource);
                app.event.emit(PlayerPetEvent.UPDATE)
                app.event.emit(PlayerPetEvent.UPDATE_ADD,pet)
            }else{
                operation = ResourceUpdateType.UPDATE;
                this.onUpdateOV(operation,resource);
            }
        }else if(operation == ResourceUpdateType.MINUS){

            //删除的宠物
            let delPet;
            //删除指定的宠物
            this.datas = this.datas.filter(pet => {
                if(pet.petId == resource.petId){
                    delPet = pet;
                    return false;
                }
                return true;
            });
            app.event.emit(PlayerPetEvent.UPDATE)
            delPet && app.event.emit(PlayerPetEvent.UPDATE_MINUS,delPet)

        }

    }

}