import { _decorator, Label,sp, UITransform, Vec2, Vec3 ,Node, isValid, tween} from 'cc';
import { ObjectUtil } from '../../../../framework/util/ObjectUtil';
import { BattleNodeBase } from './BattleNodeBase';
import { HeroData } from '../data/HeroData';
import { AudioID } from '../../../../framework/config/AudioConf';
import { Framework } from '../../../../framework/Framework';
import { UptypeConf } from '../conf/UptypeConf';
import { HeroConf } from '../conf/HeroConf';
import { BattleEventManager } from '../base/BattleEventManager';
import { BattleEventHeroAction, BattleEventTarget, HeroActionType } from '../base/BattleEventUtil';
import { BattleUtil } from '../data/BattleUtil';
const { ccclass, property } = _decorator;


//英雄基类
@ccclass('Hero')
export class Hero extends BattleNodeBase {



    @property({ type: sp.Skeleton, tooltip: '骨骼动画' })
    modelSpine: sp.Skeleton = null;
    @property({ type: Label, tooltip: '等级' })
    levelLabel: Label = null;

    @property({ type: Node, tooltip: '枪' })
    gunNode: Node = null;

    @property({ type: UITransform, tooltip: '点击框' })
    clickBox: UITransform = null;

    //所属格子 -1表示暂无
    private _posID = -1;

  
    private _bAttackAnimation: boolean = false;

    attackNode = null;
    //
    attackBone1 = null;
    attackBone2 = null;
    attackBone3 = null;
    attackBone4 = null;

    attackAngle1 = 0;
    attackAngle2 = 0;
    attackAngle3 = 0;
    attackAngle4 = 0;

    attackSlot = null;
    typeID: number = -1; 
    level: number = 1; 
    radius = 1; //半径



    battleEventManager: BattleEventManager;


    set posID(posID:number){
        this._posID = posID;
    }
    get posID(){
        return this._posID;
    }

    protected onLoad(): void {
         this.modelSpine.setCompleteListener(this.actionComplete.bind(this))
        this.modelSpine.setEventListener(this.actionCallback.bind(this))

        this.battleEventManager = BattleEventManager.instance
        let bone1 = this.modelSpine.findBone("gun")
        if(bone1){
            this.attackBone1= bone1
            let rot = this.attackBone1.rotation
            this.attackAngle1 = rot
            console.log("rot",rot)
        }

        let bone2 = this.modelSpine.findBone("gun2")
        if(bone2){
            this.attackBone2 = bone2
            let rot = this.attackBone2.rotation
            this.attackAngle2 = rot
            console.log("rot",rot)
        }

        let bone3 = this.modelSpine.findBone("gun3")
        if(bone3){
            this.attackBone3 = bone3
            let rot = this.attackBone3.rotation
            this.attackAngle3 = rot
            console.log("rot",rot)
        }

        let bone4 = this.modelSpine.findBone("gun")
        if(bone4){
            this.attackBone4 = bone4
            let rot = this.attackBone4.rotation
            this.attackAngle4 = rot
            console.log("rot",rot)
        }


        // this.clickBox.setContentSize(this.modelSpine.getComponent(UITransform).contentSize)
    }

    start() {
       
    }


    resetData(heroData:HeroData) {
        this.typeID = heroData.typeID;
        this.level = heroData.level;
        this.radius = heroData.attackRadius;
        this.levelLabel.string = heroData.level.toString();
        this.node.active = true;
        this.modelSpine.node.active = true;
        let conf = UptypeConf.data
        let speedScale = conf.HeroSpeedColArr[this.level]
        this.modelSpine.timeScale = speedScale;
        this.stand()
        // let id: string = heroData.heroID;
        
    }


    clearData() {
        this.node.active = false;
        this.modelSpine.node.active = false;
        this._posID = -1;
        this.typeID = -1;
        this.level = 0;
        this._isLock = false;
    }


    update(deltaTime: number) {
        super.update(deltaTime);
        if(this._bAttackAnimation && isValid(this.attackNode)){
            let pos = this.attackNode.position;
            // 获取子节点的世界坐标
            let worldPosition = this.gunNode.getComponent(UITransform).convertToWorldSpaceAR(Vec3.ZERO);
            // 将子节点的世界坐标转换为父节点的局部坐标
            let localPosition = this.node.parent.getComponent(UITransform).convertToNodeSpaceAR(worldPosition);
            // 计算从p0到p1的向量
            let deltaX: number = pos.x - localPosition.x;
            let deltaY: number = pos.y - localPosition.y;

            // 计算旋转角度（弧度）
            let rotationAngleRadians: number = Math.atan2(deltaY, deltaX);
            // 将旋转角度转换为度数
            let rotationAngleDegrees: number = (rotationAngleRadians * (180 / Math.PI)+360)%360;

            // console.log("旋转角度：", rotationAngleDegrees);

            // let scaleX = this.modelSpine.node.scale.x
            // if(rotationAngleDegrees > 90 && rotationAngleDegrees < 270){
            //     // if(scaleX > 0){
            //     //     scaleX= -scaleX;
            //     // }
            //     // this.gunNode.angle = 180 - rotationAngleDegrees;
            //     this.attackBone.rotation = 180 - rotationAngleDegrees
            // }
            // else{
            //     // if(scaleX < 0){
            //     //     scaleX= -scaleX;
            //     // }
            //     // this.gunNode.angle = rotationAngleDegrees;
            //     this.attackBone.rotation = rotationAngleDegrees
            // }
            // this.modelSpine.node.scale = new Vec3(scaleX,this.modelSpine.node.scale.y,this.modelSpine.node.scale.z);
            // console.log("旋转角度：", rotationAngleDegrees);

            this.attackBone1.rotation = 0
            this.attackBone2.rotation = 0
            this.attackBone3.rotation = 0
            this.attackBone4.rotation = 0

            if(rotationAngleDegrees<67.5 || rotationAngleDegrees > 292.5){
                this.attackBone1.rotation = 360-(rotationAngleDegrees+this.attackAngle1)
                if(this.modelSpine.animation != "attack_right")
                    this.modelSpine.setAnimation(0, 'attack_right', true);
            }
            else if(rotationAngleDegrees < 112.5){
                this.attackBone3.rotation = rotationAngleDegrees+this.attackAngle3-90
                if(this.modelSpine.animation != "attack_up")
                    this.modelSpine.setAnimation(0, 'attack_up', true);
            }
            else if(rotationAngleDegrees < 247.5){
                this.attackBone4.rotation = rotationAngleDegrees+this.attackAngle4-180
                if(this.modelSpine.animation != "attack_left")
                    this.modelSpine.setAnimation(0, 'attack_left', true);
            }
            else if(rotationAngleDegrees < 292.5){
                this.attackBone2.rotation = rotationAngleDegrees+this.attackAngle2-270
                if(this.modelSpine.animation != "attack_down")
                    this.modelSpine.setAnimation(0, 'attack_down', true);
            }
        }

       
    }
    //屏幕坐标
    bTouch(pos: Vec2){
       return this.node.getComponent(UITransform).hitTest(pos,0);
    }

    get bAttackAnimation(): boolean{
        return this._bAttackAnimation;
    }


    //通过目标坐标 来确定朝向
    attack(attackNode:Node){
        if(!this.modelSpine.node.active) return;
        
        // if(this._bAttackAnimation) return; 
        this._bAttackAnimation = true;

        this.attackNode = attackNode;

        Framework.audio.playEffect(AudioID.Tututu);
    }

    stand() {
        if(!this.modelSpine.node.active) return;
        this._bAttackAnimation = false;
        // this.gunNode.angle = 0;
        this.gunNode.active = true;
                this.attackBone1.rotation = 0
                this.attackBone2.rotation = 0
                this.attackBone3.rotation = 0
                this.attackBone4.rotation = 0
                // this._attackCallback = null;
        if(this.modelSpine.animation == "stand_right") return; 
        this.modelSpine.setAnimation(0, 'stand_right', true);
        // if(this.modelSpine.node.scale.x < 0)
        //     this.modelSpine.node.scale = new Vec3(-this.modelSpine.node.scale.x,this.modelSpine.node.scale.y,this.modelSpine.node.scale.z);

    }

    levelUp() {
        this.level++;
        this.levelLabel.string = this.level.toString();
        let conf = UptypeConf.data
        let speedScale = conf.HeroSpeedColArr[this.level]
        this.modelSpine.timeScale = speedScale;
    }

    actionCallback(trackEntry){
        //  console.log("动作回调：",trackEntry.animation.name)
        if (trackEntry.animation.name && trackEntry.animation.name.includes("attack")) {

            // if (this._attackCallback) {
            //     this._attackCallback(trackEntry);
            // }
            // console.log("攻击动作完成：",trackEntry.animation.name)
            if(this.posID > BattleUtil.PosID_Init){
                let eventData:BattleEventHeroAction = {
                    action: HeroActionType.Normal,
                    posIndex: this._posID - BattleUtil.BagListSize
                }
                this.battleEventManager.fireEvent(BattleEventTarget.HeroAction,eventData)
            }
        } 
    }

    actionComplete(trackEntry:sp.spine.TrackEntry){
        // console.log("动作完成：",trackEntry.animation.name,this._posID)
        if (trackEntry.animation.name && trackEntry.animation.name.includes("fire")) {

            // this._bAttackAnimation = false;
            // // this.gunNode.angle = 0;
            // // this.gunNode.active = false;
            
            //     this.attackBone.rotation = 0
                // this._attackCallback = null;
        } 
    }

    //
    flyTo(pos:Vec3, callback:Function){
        if(this._isLock){ return false; }
        this.isLock = true;
        let length = Vec3.distance(this.node.position,pos);
        if(length > 300){
            length = 300;
        }
        tween(this.node).to(length/500,{position:pos}).call(()=>{
            this.isLock = false;
            if(callback) callback();
        }).start();
        
    }

    hitTest(pos:Vec2){

        return this.clickBox.hitTest(pos) || this.node.getComponent(UITransform).hitTest(pos);
    }

    
}


