import { eventTarget, PLAY_ROLLING_SOUND } from "../Events";

const { ccclass, property } = cc._decorator;

@ccclass
export default class DevicemotionController extends cc.Component {

    private _x: number = 0;
    private _y: number = 0;
    private _z: number = 0;
    private _count = 0;
    private _isShake = false;
    private _debug: cc.Label = null;

    protected onLoad(): void {
        this._debug = this.node.getComponentInChildren(cc.Label);

        if (cc.sys.os === cc.sys.OS_IOS) {
            this.setDeviceMotionIOS();
        }
        else {
            this.scheduleOnce(this.setDeviceMotion, 2);
        }
    }

    private setDeviceMotionIOS() {
        const debug = (text: string) => {
            this._debug.string = text;
        }

        debug('setDeviceMotionIOS');

        if (window.DeviceMotionEvent) {
            // Yêu cầu quyền truy cập trên iOS (từ iOS 13+)
            if (typeof (DeviceMotionEvent as any).requestPermission === 'function') {
                debug('requestPermission');
                (DeviceMotionEvent as any).requestPermission()
                    .then(permissionState => {
                        debug('requestPermission: ' + permissionState);
                        if (permissionState === 'granted') {
                            debug('granted setDeviceMotion');
                            this.setDeviceMotion();
                        } else {
                            debug('Không được cấp quyền sử dụng DeviceMotion');
                            console.log('Không được cấp quyền sử dụng DeviceMotion');
                        }
                    })
                    .catch(e => {
                        console.error(e);
                        debug('Không được cấp quyền sử dụng DeviceMotion');
                    });
            } else {
                debug('Không hỗ trợ requestPermission');
                this.setDeviceMotion();
            }
        } else {
            debug('Trình duyệt không hỗ trợ DeviceMotion API');
            console.log('Trình duyệt không hỗ trợ DeviceMotion API');
        }
    }

    private setDeviceMotion() {
        window.addEventListener("devicemotion", (event) => {
            if (!event.accelerationIncludingGravity) {
                return;
            }

            const x = event.accelerationIncludingGravity.x;
            const y = event.accelerationIncludingGravity.y;
            const z = event.accelerationIncludingGravity.z;

            if (x - this._x > 5 || y - this._y > 5 || z - this._z > 5) {
                if (this._isShake) {
                    this._count++;
                }
            }

            if (x - this._x < -5 || y - this._y < -5 || z - this._z < -5) {
                if (!this._isShake) {
                    this._count++;
                }
            }

            if (this._count > 0) {
                this.scheduleOnce(() => {
                    this._count = 0;
                }, 2)
            }

            if (this._count > 5) {
                this._count = 0;
                this.shakeBottle();
            }

            this._x = x;
            this._y = y;
            this._z = z;
        });
    }

    private shakeBottle() {
        eventTarget.emit(PLAY_ROLLING_SOUND);
        cc.tween(this.node)
            .repeat(5, cc.tween(this.node)
                .call(() => this.vibratePhone())
                .to(0.2, { position: cc.v3(40, this.randomY(), 0) })
                .to(0.2, { position: cc.v3(-40, this.randomY(), 0) })
            )
            .to(0.2, { position: cc.v3(0, 0, 0) })
            .start();
    }

    private vibratePhone() {
        if ("vibrate" in navigator) {
            navigator.vibrate(200);
        }
    }

    private randomY(): number {
        return Math.random() * 100 - 50;
    }
}
