import type { Context } from '../engine/engine_context.js';
import { serializable } from '../engine/engine_serialization.js';
import { DeviceUtilities } from '../engine/engine_utils.js';
import { Behaviour } from './Component.js';

/** 
 * Provides configuration options for the built-in Needle Menu.
 * Needle Menu uses HTML in 2D mode, and automatically switches to a 3D menu in VR/AR mode.
 * 
 * Controls display options, button visibility, and menu positioning.
 * From code, you can access the menu via {@link Context.menu}. 
 * @category User Interface
 * @group Components
 **/
export class NeedleMenu extends Behaviour {

    /**
     * Determines the vertical positioning of the menu on the screen
     */
    @serializable()
    position: "top" | "bottom" = "bottom";

    /** 
     * Controls the visibility of the Needle logo in the menu (requires PRO license)
     */
    @serializable()
    showNeedleLogo: boolean = false;

    /** 
     * When enabled, displays the menu in VR/AR mode when the user looks up
     * @default undefined
     */
    @serializable()
    showSpatialMenu?: boolean;

    /** 
     * When enabled, adds a fullscreen toggle button to the menu
     * @default undefined
     */
    @serializable()
    createFullscreenButton?: boolean;
    
    /** 
     * When enabled, adds an audio mute/unmute button to the menu
     * @default undefined
     */
    @serializable()
    createMuteButton?: boolean;

    /**
     * When enabled, adds a button to display a QR code for sharing the application.
     * The QR code is only displayed on desktop devices.
     * @default undefined
     */
    @serializable()
    createQRCodeButton?: boolean;

    /** 
     * Applies the configured menu options when the component is enabled
     * @hidden
     */
    onEnable() {
        this.applyOptions();
    }

    /** 
     * Applies all configured options to the active {@link Context.menu}.
     */
    applyOptions() {
        this.context.menu.setPosition(this.position);
        this.context.menu.showNeedleLogo(this.showNeedleLogo);
        if (this.createFullscreenButton === true)
            this.context.menu.showFullscreenOption(true);
        if (this.createMuteButton === true)
            this.context.menu.showAudioPlaybackOption(true);
        if (this.showSpatialMenu === true)
            this.context.menu.showSpatialMenu(this.showSpatialMenu);
        if (this.createQRCodeButton === true) {
            if (!DeviceUtilities.isMobileDevice()) {
                this.context.menu.showQRCodeButton(true);
            }
        }
    }

}