/// <reference types="node" />
import { EventEmitter } from "events";
import { ConsoleManager, KeyListenerArgs } from "../../ConsoleGui.js";
import { PhisicalValues } from "../Utils.js";
/**
 * @description The configuration for the FileSelectorPopup class.
 * @typedef {Object} FileSelectorPopupConfig
 *
 * @prop {string} id - The id of the file selector popup.
 * @prop {string} title - The title of the file selector popup.
 * @prop {string} basePath - The base path of the file selector popup.
 * @prop {boolean} [selectDirectory] - If the file selector popup can select directories.
 * @prop {Array<string>} [allowedExtensions] - The allowed extensions. If not set, all extensions are allowed.
 * @prop {boolean} [limitToPath] - If true, the user can select a directory. Otherwise, only files are selectable. When true, to enter a directory, the user must press the space key instead of the enter key.
 * @prop {boolean} [visible] - If the file selector popup is visible.
 *
 * @export
 * @interface FileSelectorPopupConfig
 */
export interface FileSelectorPopupConfig {
    id: string;
    title: string;
    basePath: string;
    selectDirectory?: boolean;
    allowedExtensions?: string[];
    limitToPath?: boolean;
    visible?: boolean;
}
/**
 * @description The file descriptions for the file selector popup.
 * @typedef {Object} FileItemObject
 * @prop {string} name - The name of the file.
 * @prop {string} path - The path to the file.
 * @prop {"dir" | "file"} type - The type of the file.
 * @prop {string} text - The display text of the file.
 *
 * @interface FileItemObject
 */
interface FileItemObject {
    text: string;
    name: string;
    type: "dir" | "file";
    path: string;
}
/**
 * @class FileSelectorPopup
 * @extends EventEmitter
 * @description This class is used to create a popup with a file input to select a file or a directory.
 * It will run a promise with fs.readdir to get the list of files and directories.
 * The user can select a file or a directory and the popup will be closed.
 *
 * ![FileSelectorPopup](https://user-images.githubusercontent.com/14907987/165938464-c1426102-b598-42bb-8597-6337f0bcb009.gif)
 *
 * Emits the following events:
 * - "confirm" when the user confirm the file or directory selection. The file or directory path is passed as parameter like this: {path: "path/to/file", name: "file.ext"}
 * - "cancel" when the user cancel the file or directory selection.
 * - "exit" when the user exit
 * @param {FileSelectorPopupConfig} config - The configuration for the FileSelectorPopup class.
 *
 * @example ```ts
 * const popup = new FileSelectorPopup({
 *  id: "popup1",
 *  title: "Choose the file",
 *  basePath: "./examples"
 * }).show().on("confirm", (selected) => {
 *  console.log(selected)
 * }) // show the popup and wait for the user to confirm
 */
export declare class FileSelectorPopup extends EventEmitter {
    readonly CM: ConsoleManager;
    readonly id: string;
    title: string;
    private basePath;
    currentPath: string;
    private selectDirectory;
    private allowedExtensions;
    private limitToPath;
    private visible;
    private marginTop;
    private startIndex;
    private selected;
    private options;
    private parsingMouseFrame;
    /** @var {number} x - The x offset of the popup to be drown. If 0 it will be placed on the center */
    private offsetX;
    /** @var {number} y - The y offset of the popup to be drown. If 0 it will be placed on the center */
    private offsetY;
    private absoluteValues;
    private dragging;
    private dragStart;
    private focused;
    constructor(config: FileSelectorPopupConfig);
    /**
     * @description This function is used to load the list of files and directories in the current path.
    it return a promise with the list of files and directories. The list is an array of objects like this:
    [{text: "📄 file.ext", name: "file.ext", type: "file", path: "path/to/file.ext"}, {text: "📁 dir/", name: "dir", type: "dir", path: "path/to/dir"}]
     * @param {string} dir - The path to load the list.
     * @returns {Promise<Array<object>>} The list of files and directories.
     * @memberof FileSelectorPopup
     */
    private listDir;
    /**
     * @description This function calls the updateList function and store the result to this.options, it also refresh the list of files and directories.
     * @param {string} _path - The path to load the list.
     * @memberof FileSelectorPopup
     */
    private updateList;
    private adaptOptions;
    /**
     * @description This function is used to make the ConsoleManager handle the key events when the popup is showed.
     * Inside this function are defined all the keys that can be pressed and the actions to do when they are pressed.
     * @param {string} str - The string of the input.
     * @param {Object} key - The key object.
     * @memberof FileSelectorPopup
     */
    keyListener(_str: string, key: KeyListenerArgs): void;
    /**
     * @description This function is used to get the selected option.
     * @returns {FileItemObject} The selected value of the popup.
     * @memberof FileSelectorPopup
     */
    getSelected(): FileItemObject;
    /**
     * @description This function is used to change the selection of the popup. It also refresh the ConsoleManager.
     * @param {FileItemObject} selected - The new value of the selection.
     * @memberof FileSelectorPopup
     * @returns {FileSelectorPopup} The instance of the FileSelectorPopup.
     */
    private setSelected;
    /**
     * @description This function is used to show the popup. It also register the key events and refresh the ConsoleManager.
     * @returns {FileSelectorPopup} The instance of the FileSelectorPopup.
     * @memberof FileSelectorPopup
     */
    show(): FileSelectorPopup;
    /**
     * @description This function is used to hide the popup. It also unregister the key events and refresh the ConsoleManager.
     * @returns {FileSelectorPopup} The instance of the FileSelectorPopup.
     * @memberof FileSelectorPopup
     */
    hide(): FileSelectorPopup;
    /**
     * @description This function is used to get the visibility of the popup.
     * @returns {boolean} The visibility of the popup.
     * @memberof FileSelectorPopup
     */
    isVisible(): boolean;
    /**
     * @description This function is used to return the PhisicalValues of the popup (x, y, width, height).
     * @memberof FileSelectorPopup
     * @private
     * @returns {FileSelectorPopup} The instance of the FileSelectorPopup.
     * @memberof FileSelectorPopup
     */
    getPosition(): PhisicalValues;
    /**
     * @description This function is used to add the FileSelectorPopup key listener callback to te ConsoleManager.
     * @returns {FileSelectorPopup} The instance of the FileSelectorPopup.
     * @memberof FileSelectorPopup
     */
    private manageInput;
    /**
     * @description This function is used to remove the FileSelectorPopup key listener callback to te ConsoleManager.
     * @returns {FileSelectorPopup} The instance of the FileSelectorPopup.
     * @memberof FileSelectorPopup
     */
    private unManageInput;
    /**
     * @description This function is used to manage the mouse events on the OptionPopup.
     * @param {MouseEvent} event - The string of the input.
     * @memberof OptionPopup
     */
    private mouseListener;
    /**
     * @description This function is used to draw the FileSelectorPopup to the screen in the middle.
     * @returns {FileSelectorPopup} The instance of the FileSelectorPopup.
     * @memberof FileSelectorPopup
     */
    draw(): FileSelectorPopup;
}
export default FileSelectorPopup;
//# sourceMappingURL=FileSelectorPopup.d.ts.map