import { ComputedRef } from 'vue';
import { GetBitableUrlOptions } from '@lark-base-open/js-sdk';
import { IEventCbCtx } from '@lark-base-open/js-sdk';
import { ITable } from '@lark-base-open/js-sdk';
import type { IView } from '@lark-base-open/js-sdk';
import { MaybeRefOrGetter } from 'vue';
import { Product } from '@lark-base-open/js-sdk';
import { Ref } from 'vue';
import { Selection as Selection_2 } from '@lark-base-open/js-sdk';
import { ShallowRef } from 'vue';
import { ThemeModeType } from '@lark-base-open/js-sdk';

/**
 * FileReader options
 */
export declare interface fileReaderOptions<T> {
    /**
     * Progress event handler
     *
     * 进度事件处理程序
     *
     * @param ev
     * @returns
     */
    onProgress?: (ev: ProgressEvent<FileReader>) => void;
    /**
     * Error event handler
     *
     * 错误事件处理程序
     *
     * @param ev
     * @returns
     */
    onError?: (ev: ProgressEvent<FileReader>) => void;
    /**
     * Load event handler
     *
     * 加载事件处理程序
     *
     * @param data
     * @param resolve
     * @returns
     */
    load?: (data: ArrayBuffer, resolve: (value: T) => void) => void;
    /**
     * Is data a shallowRef
     *
     * data 是否为 shallowRef
     */
    shallow?: boolean;
}

/**
 * Listen to field add event
 *
 * 监听字段增加事件
 *
 * @param table
 * @param callback
 * @returns
 */
export declare function onFieldAdd(table: MaybeRefOrGetter<ITable | string | null>, callback: (ev: IEventCbCtx<unknown>) => void): {
    off: () => void;
    pending: Ref<boolean>;
};

/**
 * Listen to field delete event
 *
 * 监听字段删除事件
 *
 * @param table
 * @param callback
 * @returns
 */
export declare function onFieldDelete(table: MaybeRefOrGetter<ITable | string | null>, callback: (ev: IEventCbCtx<unknown>) => void): {
    off: () => void;
    pending: Ref<boolean>;
};

/**
 * Listen to field modify event
 *
 * 监听字段修改事件
 *
 * @param table
 * @param callback
 * @returns
 */
export declare function onFieldModify(table: MaybeRefOrGetter<ITable | string | null>, callback: (ev: IEventCbCtx<unknown>) => void): {
    off: () => void;
    pending: Ref<boolean>;
};

/**
 * Listen to record add event
 *
 * 监听记录添加事件
 *
 * @param table
 * @param callback
 * @returns
 */
export declare function onRecordAdd(table: MaybeRefOrGetter<ITable | string | null>, callback: (ev: IEventCbCtx<[recordId: string]>) => void): {
    off: () => void;
    pending: Ref<boolean>;
};

/**
 * Listen to record delete event
 *
 * 监听记录删除事件
 *
 * @param table
 * @param callback
 * @returns
 */
export declare function onRecordDelete(table: MaybeRefOrGetter<ITable | string | null>, callback: (ev: IEventCbCtx<[recordId: string]>) => void): {
    off: () => void;
    pending: Ref<boolean>;
};

/**
 * Listen to record modify event
 *
 * 监听记录修改事件
 *
 * @param table
 * @param callback
 * @returns
 */
export declare function onRecordModify(table: MaybeRefOrGetter<ITable | string | null>, callback: (ev: IEventCbCtx<{
    recordId: string;
    fieldIds: string[];
}>) => void): {
    off: () => void;
    pending: Ref<boolean>;
};

/**
 * Listen to selection change
 *
 * 监听选中项变化
 *
 * @param callback
 * @returns
 */
export declare function onSelectionChange(callback: (e: Selection_2) => void): () => void;

/**
 * Listen to table add event
 *
 * 监听表格添加事件
 *
 * @param callback
 * @returns
 */
export declare function onTableAdd(callback: (ev: IEventCbCtx) => void): () => void;

/**
 * Listen to table delete event
 *
 * 监听表格删除事件
 *
 * @param callback
 * @returns
 */
export declare function onTableDelete(callback: (ev: IEventCbCtx) => void): () => void;

/**
 * Listen to theme change
 *
 * 监听主题变化
 *
 * @param callback
 * @returns
 */
export declare function onThemeChange(callback: (theme: ThemeModeType) => void): () => void;

export declare interface SelectHistory {
    select: Selection_2;
    time: TimeStamp;
}

export declare interface Serializer<T = unknown, R = unknown> {
    read: (raw: R) => T;
    write: (data: T) => R;
}

export declare type TimeStamp = number;

/**
 * Reactive Bitable Url
 *
 * 响应式 Bitable Url
 *
 * @param table
 * @param view
 * @param field
 * @param record
 */
export declare function useBitableUrl(table: MaybeRefOrGetter<GetBitableUrlOptions["tableId"]>, view: MaybeRefOrGetter<GetBitableUrlOptions["viewId"]>, field?: MaybeRefOrGetter<GetBitableUrlOptions["fieldId"]>, record?: MaybeRefOrGetter<GetBitableUrlOptions["recordId"]>, options?: useBitableUrlOptions): Ref<string>;

export declare interface useBitableUrlOptions {
    /**
     * The params will be append to the url
     *
     * 附加参数
     */
    params?: Record<string, string> | (() => Record<string, string>);
    /**
     * If true, the url will be override by the params when same param key exists
     *
     * 如果为true，url将会被params覆盖，当存在相同的key时
     *
     * @default false
     */
    override?: boolean;
}

/**
 * Reactive Bitable data
 *
 * 响应式的 Bitable 数据
 *
 * @param options
 * @returns
 */
export declare function useData<T = unknown, R = T>(key: MaybeRefOrGetter<string>, defaults?: T, options?: useDataOptions<T, R>): {
    data: Ref<T>;
    pending: Ref<boolean>;
};

/**
 * useData options
 *
 * useData 配置项
 */
declare interface useDataOptions<T = unknown, R = unknown> {
    /**
     * Serialization
     *
     * 序列化
     */
    serializer?: Serializer<T, R>;
    /**
     * Whether to shallowly watch for changes
     *
     * 是否浅层监听变化
     *
     * @default false
     */
    shallow?: boolean;
}

/**
 * Get current environment
 *
 * 获取当前环境
 *
 * @returns
 */
export declare function useEnv(): Ref<Product | null>;

/**
 * Use `FileReader`
 *
 * 使用 `FileReader` API
 *
 * @see https://use-bitable.vercel.app/zh/references/composables/useFileReader/
 * @relation https://developer.mozilla.org/en-US/docs/Web/API/FileReader
 * @param file
 * @param options
 * @returns
 */
export declare function useFileReader<T = string>(file: MaybeRefOrGetter<File | null>, options?: fileReaderOptions<T>): {
    data: Ref<T | null | undefined>;
    pending: Ref<boolean>;
    name: Ref<string>;
};

/**
 * Get personalBase token
 *
 * 获取 personalBase token
 *
 * @returns
 */
export declare function usePersonalBaseToken(): Ref<string | null>;

/**
 * Reactive bitable selection history
 *
 * 响应式的 `bitable` 选中项历史记录
 *
 * @param options
 * @returns
 */
export declare function useSelectHistory(options?: useSelectHistoryOptions): Ref<{
    select: {
        baseId: string | null;
        tableId: string | null;
        viewId: string | null;
        fieldId: string | null;
        recordId: string | null;
    };
    time: number;
}[]>;

export declare interface useSelectHistoryOptions {
    /**
     * Max history length
     *
     * 最大历史记录长度
     *
     * @default Infinity
     */
    max?: number;
}

/**
 * Reactive bitable selection
 *
 * 响应式的bitable当前选中项
 *
 * @param options
 */
export declare function useSelection(options?: useSelectionOptions): {
    baseId: Ref<string | null>;
    recordId: Ref<string | null>;
    fieldId: Ref<string | null>;
    viewId: Ref<string | null>;
    tableId: Ref<string | null>;
};

declare interface useSelectionOptions {
    onChanged?: (selection: Selection_2) => void;
}

/**
 * Reactive table
 *
 * 响应式表格
 *
 * @param tableIdOrName
 * @returns
 */
export declare function useTable(tableIdOrName: MaybeRefOrGetter<string | null>): {
    table: ShallowRef<ITable | null>;
    pending: Ref<boolean>;
};

/**
 * Get current tenant ID
 *
 * 获取当前租户 ID
 *
 * @returns
 */
export declare function useTenantKey(): Ref<string | null>;

/**
 * Reactive bitable theme mode
 *
 * 响应式的bitable主题模式
 *
 * @param options
 * @returns
 */
export declare function useTheme(options?: useThemeOptions): ComputedRef<ThemeModeType>;

export declare interface useThemeOptions {
    onChanged?: (theme: ThemeModeType) => void;
}

/**
 * Get current user ID
 *
 * 获取当前用户 ID
 *
 * @returns
 */
export declare function useUserId(): Ref<string | null>;

export declare function useView(table: MaybeRefOrGetter<ITable | string | null>, viewId: MaybeRefOrGetter<string | null>): {
    view: ShallowRef<IView | null>;
    pending: Ref<boolean>;
};

export { }
