import Label from '../label/Label';

export default FileSelectorButton;

declare namespace FileSelectorButton {
    /**
     * Callback fired after loading a selected file.
     */
    type LoadCompleteCallbackType = (
        /**
         * Loaded file data.
         */
        data: any
    ) => void;

    /**
     * Configuration options for creating a file selector button.
     */
    interface IConfig extends Label.IConfig {
        /**
         * Accepted MIME types or file extensions.
         */
        accept?: string,
        /**
         * Set to true to allow selecting multiple files.
         */
        multiple?: boolean,
    }
}

/**
 * Label-based button that opens file chooser dialog and loads selected files.
 */
declare class FileSelectorButton extends Label {
    /**
     * Create a file selector button.
     *
     * @param scene - Scene that owns this component.
     * @param config - Optional file selector configuration.
     */
    constructor(
        scene: Phaser.Scene,
        config?: FileSelectorButton.IConfig
    );

    /**
     * Currently selected files.
     */
    readonly files: File[];

    /**
     * Set accepted file types.
     *
     * @param accept - Accepted MIME types or extensions string.
     * @returns This component instance.
     */
    setAccept(accept: string): this;

    /**
     * Set whether multiple file selection is allowed.
     *
     * @param multiple - True to allow selecting multiple files.
     * @returns This component instance.
     */
    setMultiple(multiple?: boolean): this;

    /**
     * Load a selected file via Phaser loader.
     *
     * @param file - File object to load.
     * @param loaderType - Loader type key.
     * @param key - Cache key for loaded resource.
     * @param cacheType - Optional cache type.
     * @returns This component instance.
     */
    loadFile(
        file: File,
        loaderType: string,
        key: string,
        cacheType?: string
    ): this;

    /**
     * Load a selected file via Phaser loader with completion callback.
     *
     * @param file - File object to load.
     * @param loaderType - Loader type key.
     * @param key - Cache key for loaded resource.
     * @param cacheType - Optional cache type.
     * @param onComplete - Optional callback invoked after load completes.
     * @returns This component instance.
     */
    loadFile(
        file: File,
        loaderType: string,
        key: string,
        cacheType?: string,
        onComplete?: FileSelectorButton.LoadCompleteCallbackType
    ): this;

    /**
     * Load a selected file and return a promise.
     *
     * @param file - File object to load.
     * @param loaderType - Loader type key.
     * @param key - Cache key for loaded resource.
     * @param cacheType - Optional cache type.
     * @returns Promise resolved with loaded data.
     */
    loadFilePromise(
        file: File,
        loaderType: string,
        key: string,
        cacheType?: string
    ): Promise<any>;
}
