import { _decorator, Component, Node, input, Input, EventTouch, Vec2, Vec3, UITransform } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('JoyStickManager')
export class JoyStickManager extends Component {
    input: Vec2 = Vec2.ZERO

    private body: Node
    private stick: Node
    private touchStartPos: Vec2
    private defaultPos: Vec2
    private radius: number = 0

    init() {
        this.body = this.node.getChildByName("Body")
        this.stick = this.body.getChildByName("Stick")
        const { x, y } = this.body.position
        this.defaultPos = new Vec2(x, y)
        this.radius = this.body.getComponent(UITransform).contentSize.x / 2

        input.on(Input.EventType.TOUCH_START, this.onTouchMove, this);
        input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
        input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this);

    }

    onDestroy() {
        input.off(Input.EventType.TOUCH_START, this.onTouchMove, this);
        input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
        input.off(Input.EventType.TOUCH_END, this.onTouchEnd, this);
    }

    onTouchMove(e: EventTouch) {
        const touchPos = e.touch.getUILocation()
        if (!this.touchStartPos) {
            this.touchStartPos = touchPos.clone()
            this.body.setPosition(this.touchStartPos.x, this.touchStartPos.y);
        }

        const stickPos = new Vec2(touchPos.x - this.touchStartPos.x, touchPos.y - this.touchStartPos.y)
        const len = stickPos.length()
        if (len > this.radius) {
            stickPos.multiplyScalar(this.radius / len)
        }

        this.stick.setPosition(stickPos.x, stickPos.y)
        this.input = stickPos.clone().normalize()
    }

    onTouchEnd() {
        this.body.setPosition(this.defaultPos.x, this.defaultPos.y)
        this.stick.setPosition(0, 0)
        this.touchStartPos = undefined
        this.input = Vec2.ZERO
    }
}