import { PackageJson } from 'pkg-types';
import { DdddOcr, MODEL_TYPE, CHARSET_RANGE } from 'ddddocr-node';
import { LogSeverityLevel } from 'ddddocr-node/dist/type';
import { ValidTotpConfig, TotpConfig } from 'time2fa';
import { WorkerOptions as WorkerOptions$1 } from 'worker_threads';

declare class Ocr extends DdddOcr {
    static MODEL_TYPE: typeof MODEL_TYPE;
    static CHARSET_RANGE: typeof CHARSET_RANGE;
    static create(logSeverityLevel?: LogSeverityLevel): Ocr;
}

declare class GitUtil {
    readonly repositoryPath: string;
    constructor(repositoryPath: string);
    private changeDirectory;
    getBranchName(): Promise<string>;
    getShortCommitId(): Promise<string>;
    getCommitId(): Promise<string>;
    getUserName(): Promise<string>;
    getUserEmail(): Promise<string>;
    add(file: string): Promise<void>;
    addAll(): Promise<void>;
    commit(message: string): Promise<void>;
    commitAll(message: string): Promise<void>;
    submodulesUpdateInit(): Promise<void>;
    pullRebaseOrigin(): Promise<void>;
    pullNoRebaseOrigin(): Promise<void>;
    checkout(branch: string): Promise<void>;
    checkoutOrigin(branch: string): Promise<void>;
    pushOrigin(localBranch: string, remoteBranch?: string): Promise<void>;
}

declare class TotpBase {
    readonly config: ValidTotpConfig;
    constructor(config?: TotpConfig);
    generateSecret(): string;
    generatePasscodes(secret: string): string;
    validate(passcode: string, secret: string): boolean;
    generateUrl(issuer: string, user: string, secret: string): string;
}
declare const Totp: TotpBase;

interface WorkerOptions extends WorkerOptions$1 {
    /**
     * 最大并发数 (默认为 CPU 核心数 - 1)
     */
    max?: number;
}
declare class Worker<Args extends any[], Ret = any> {
    private filename;
    private options;
    /**
     * 工作线程池
     */
    private pool;
    /**
     * 空闲的线程
     */
    private idlePool;
    /**
     * 等待的任务
     */
    private queue;
    constructor(filename: string | URL, options?: WorkerOptions);
    run(...args: Args): Promise<Ret>;
    /**
     * 停止所有工作线程
     */
    stop(): void;
    /**
     * 获取可用的工作线程
     * @returns
     */
    private getAvailableWorker;
    /**
     * 分配完成的工作线程
     * @param worker
     * @returns
     */
    private assignDoneWorker;
}

/**
 * 任务工作者
 *
 * @example
 * ```typescript
 * class Demo extends TaskWorker<[number, number], number> {
 *  public async doWork(a: number, b: number): Promise<number> {
 *   return a + b
 * }
 *
 * new Demo()
 *
 * ```
 *
 */
declare abstract class TaskWorker<Args extends any[], Ret = any> {
    readonly workerData: any;
    constructor();
    abstract doWork(...args: Args): Ret | Promise<Ret>;
}

interface LookupFileOptions {
    /**
     * 如果设置为 true，则表示只返回文件的完整路径，而不返回文件内容。如果未指定或设置为 false，则返回文件的内容。
     */
    pathOnly?: boolean;
    /**
     * 查找文件时的根目录。只有当父目录与 rootDir 匹配或是根目录时，函数才会继续向上查找文件。
     */
    rootDir?: string;
    /**
     * 用于检查文件是否符合特定条件。只有当文件满足这个条件时，函数才会返回结果。
     * @param file
     * @returns
     */
    predicate?: (file: string) => boolean;
}
/**
 * 用于在文件系统中查找特定文件
 * @param dir 要在其中查找文件的起始目录。
 * @param formats 要查找的文件的数组。函数将遍历这些格式，直到找到匹配的文件为止。
 * @param options
 * @returns
 */
declare function lookupFile(dir: string, formats: string[], options?: LookupFileOptions): string | undefined;
declare function getPkgJson(root: string): PackageJson;
declare function getPkgName(name: string): string;
/**
 * 将指定内容写入文件
 * @param filename
 * @param content
 */
declare function writeFile(filename: string, content: string | Uint8Array): void;
declare function md5(text: string): string;
declare function getHash(text: string): string;

export { GitUtil, Ocr, TaskWorker, Totp, TotpBase, Worker, getHash, getPkgJson, getPkgName, lookupFile, md5, writeFile };
export type { LookupFileOptions, WorkerOptions };
