/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @format
 */
import type { ReactElement } from 'react';
import { Logger } from '../utils/Logger';
import { Device } from './DevicePlugin';
import { NormalizedMenuEntry } from './MenuEntry';
import { RealFlipperClient } from './Plugin';
import { Notification } from './Notification';
import { ExecOptions, ExecOut, BufferEncoding, MkdirOptions, DownloadFileStartOptions, DownloadFileStartResponse, DownloadFileUpdate, RmOptions, fsConstants, EnvironmentInfo, FSStatsLike, FlipperServerCommands, ENVIRONMENT_VARIABLES, User } from 'flipper-common';
import { CreatePasteArgs, CreatePasteResult } from './Paste';
import { Atom } from '../state/atom';
export type FileEncoding = 'utf-8' | 'base64' | 'binary';
export interface FileDescriptor {
    data: string | Uint8Array | undefined;
    name: string;
    encoding: FileEncoding;
}
export interface DownloadFileResponse extends DownloadFileStartResponse {
    /**
     * Indicates whether a download is completed. Resolves with the number of downloaded bytes. Rejects if the download has errors.
     */
    completed: Promise<number>;
}
export type RemoteServerContext = {
    childProcess: {
        exec(command: string, options?: {
            encoding?: BufferEncoding;
        } & ExecOptions): Promise<ExecOut<string>>;
    };
    fs: {
        constants: typeof fsConstants;
        access(path: string, mode?: number): Promise<void>;
        pathExists(path: string, mode?: number): Promise<boolean>;
        unlink(path: string): Promise<void>;
        mkdir(path: string, options: {
            recursive: true;
        } & MkdirOptions): Promise<string | undefined>;
        mkdir(path: string, options?: {
            recursive?: false;
        } & MkdirOptions): Promise<void>;
        rm(path: string, options?: RmOptions): Promise<void>;
        copyFile(src: string, dest: string, flags?: number): Promise<void>;
        stat(path: string): Promise<FSStatsLike>;
        readlink(path: string): Promise<string>;
        readFile(path: string, options?: {
            encoding?: BufferEncoding;
        }): Promise<string>;
        readFileBinary(path: string): Promise<Uint8Array>;
        writeFile(path: string, contents: string, options?: {
            encoding?: BufferEncoding;
        }): Promise<void>;
        writeFileBinary(path: string, contents: Uint8Array): Promise<void>;
    };
    downloadFile(url: string, dest: string, options?: DownloadFileStartOptions & {
        onProgressUpdate?: (progressUpdate: DownloadFileUpdate) => void;
    }): Promise<DownloadFileResponse>;
};
/**
 * This interface exposes all global methods for which an implementation will be provided by Flipper itself
 */
export interface FlipperLib {
    isFB: boolean;
    logger: Logger;
    enableMenuEntries(menuEntries: NormalizedMenuEntry[]): void;
    createPaste(args: string | CreatePasteArgs): Promise<CreatePasteResult | undefined>;
    GK(gatekeeper: string): boolean;
    selectPlugin(device: Device, client: RealFlipperClient | null, pluginId: string, deeplink: unknown): void;
    writeTextToClipboard(text: string): void;
    openLink(url: string): void;
    showNotification(pluginKey: string, notification: Notification): void;
    DetailsSidebarImplementation?(props: {
        children: any;
        width?: number;
        minWidth?: number;
        onResize?: (width: number, height: number) => void;
    }): ReactElement | null;
    /**
     * @returns
     * Imported file data.
     * If user cancelled a file selection - undefined.
     */
    importFile(options?: {
        /**
         * Default directory to start the file selection from
         */
        defaultPath?: string;
        /**
         * List of allowed file extensions
         */
        extensions?: string[];
        /**
         * Open file dialog title
         */
        title?: string;
        /**
         * File encoding
         */
        encoding?: FileEncoding;
        /**
         * Allow selection of multiple files
         */
        multi?: false;
    }): Promise<FileDescriptor | undefined>;
    importFile(options?: {
        defaultPath?: string;
        extensions?: string[];
        title?: string;
        encoding?: FileEncoding;
        multi: true;
    }): Promise<FileDescriptor[] | undefined>;
    /**
     * @returns
     * An exported file path (if available) or a file name.
     * If user cancelled a file selection - undefined.
     */
    exportFile(
    /**
     * New file data
     */
    data: string, options?: {
        /**
         * A file path suggestion for a new file.
         * A dialog to save file will use it as a starting point.
         * Either a complete path to the newly created file, a path to a directory containing the file, or the file name.
         */
        defaultPath?: string;
        /**
         * File encoding
         */
        encoding?: FileEncoding;
    }): Promise<string | undefined>;
    /**
     * @returns
     * An exported file path (if available) or a file name.
     * If user cancelled a file selection - undefined.
     */
    exportFileBinary(
    /**
     * New file data
     */
    data: Uint8Array, options?: {
        /**
         * A file path suggestion for a new file.
         * A dialog to save file will use it as a starting point.
         * Either a complete path to the newly created file, a path to a directory containing the file, or the file name.
         */
        defaultPath?: string;
    }): Promise<string | undefined>;
    paths: {
        appPath: string;
        homePath: string;
        staticPath: string;
        tempPath: string;
    };
    environmentInfo: {
        os: EnvironmentInfo['os'];
        isHeadlessBuild: boolean;
        env: Partial<Record<ENVIRONMENT_VARIABLES, string>>;
    };
    remoteServerContext: RemoteServerContext;
    intern: InternAPI;
    settings: () => {
        isDarkMode: boolean;
    };
    /**
     * Exposes a subset of server actions to be performed on devises
     */
    runDeviceAction: <T extends Extract<keyof FlipperServerCommands, `ios-${string}` | `android-${string}`>>(cmd: T, ...params: Parameters<FlipperServerCommands[T]>) => ReturnType<FlipperServerCommands[T]>;
}
interface InternAPI {
    graphGet: FlipperServerCommands['intern-graph-get'];
    graphPost: FlipperServerCommands['intern-graph-post'];
    /**
     * @deprecated
     */
    isLoggedIn: FlipperServerCommands['is-logged-in'];
    currentUser: () => Atom<User | null>;
    isConnected: () => Atom<boolean>;
}
export declare let flipperLibInstance: FlipperLib | undefined;
export declare function tryGetFlipperLibImplementation(): FlipperLib | undefined;
export declare function getFlipperLib(): FlipperLib;
export declare function setFlipperLibImplementation(impl: FlipperLib | undefined): void;
export {};
//# sourceMappingURL=FlipperLib.d.ts.map