import tippy, { Props, Instance } from 'tippy.js';
import { InjectionToken, Type, ElementRef, Provider, EnvironmentProviders } from '@angular/core';
import { Observable } from 'rxjs';
import { ViewOptions, ResolveViewRef, Content } from '@ngneat/overview';

interface CreateOptions extends Partial<TippyProps>, ViewOptions {
    variation: string;
    preserveView: boolean;
    className: string | string[];
    data: any;
}
interface TippyInstance extends Instance {
    data?: any;
}
type TippyProps = Props;
type VariationConfig = Partial<TippyProps> & {
    isContextMenu?: boolean;
};
interface ExtendedTippyProps extends TippyProps {
    variations: Record<string, VariationConfig>;
    defaultVariation: keyof ExtendedTippyProps['variations'];
    beforeRender?: (text: string) => string;
    zIndexGetter?(): number;
}
type TippyElement = ElementRef | Element;
interface ExtendedTippyInstance<T> extends TippyInstance {
    view: ResolveViewRef<T> | null;
    $viewOptions: ViewOptions;
    context?: ViewOptions['context'];
}
type TippyConfig = Partial<ExtendedTippyProps>;
type TippyContent = Content | (() => Promise<Type<any>>);
type TippyLoader = () => typeof tippy | Promise<{
    default: typeof tippy;
}>;
declare const TIPPY_LOADER: InjectionToken<TippyLoader>;
declare const TIPPY_CONFIG: InjectionToken<Partial<ExtendedTippyProps>>;
declare const TIPPY_LOADER_COMPONENT: InjectionToken<Type<unknown>>;
type TippyLoaderTiming = Observable<void>;
declare const TIPPY_LOADER_TIMING: InjectionToken<TippyLoaderTiming>;

type Variation = Partial<TippyProps>;
declare const tooltipVariation: Variation;
declare const popperVariation: Variation;
declare function withContextMenuVariation(baseVariation: Variation): VariationConfig;

declare function provideTippyLoader(loader: TippyLoader, ...features: EnvironmentProviders[]): EnvironmentProviders;
declare function provideTippyConfig(config: TippyConfig): Provider;
declare function withTippyLoaderComponent(component: Type<unknown>): EnvironmentProviders;
declare function withTippyLoaderTiming(timing: () => TippyLoaderTiming): EnvironmentProviders;

export { TIPPY_CONFIG, TIPPY_LOADER, TIPPY_LOADER_COMPONENT, TIPPY_LOADER_TIMING, popperVariation, provideTippyConfig, provideTippyLoader, tooltipVariation, withContextMenuVariation, withTippyLoaderComponent, withTippyLoaderTiming };
export type { CreateOptions, ExtendedTippyInstance, ExtendedTippyProps, TippyConfig, TippyContent, TippyElement, TippyInstance, TippyLoader, TippyLoaderTiming, TippyProps, VariationConfig };
