import { OverlayConfig } from '@angular/cdk/overlay';
import { ViewContainerRef } from '@angular/core';
import { Constructor } from '@ng-doc/core/types';
import { NgDocOverlayAnimationEvent, NgDocContent, NgDocOverlayOrigin, NgDocOverlayPosition, ElementAnimation } from '@ng-doc/ui-kit/types';
import { Observable } from 'rxjs';
import { Direction, Directionality } from '@angular/cdk/bidi';

interface NgDocUiConfig {
    assetsPath: string;
    customIconsPath: string;
}

interface NgDocContextWithImplicit<T> {
    $implicit: T;
}

interface NgDocOverlayContainer {
    animationEvent: Observable<NgDocOverlayAnimationEvent>;
    config?: NgDocOverlayConfig;
    content: NgDocContent;
    isFocused: boolean;
    close(): void;
    markForCheck(): void;
    focus(): void;
}

interface NgDocOverlayProperties {
    origin?: NgDocOverlayOrigin;
    positions?: NgDocOverlayPosition | NgDocOverlayPosition[];
    closeIfOutsideClick?: boolean;
    closeIfInnerClick?: boolean;
    withPointer?: boolean;
    contactBorder?: boolean;
    borderOffset?: number;
    panelClass?: string | string[];
    width?: number | string;
    height?: number | string;
    minWidth?: number | string;
    minHeight?: number | string;
    maxWidth?: number | string;
    maxHeight?: number | string;
    direction?: Direction | Directionality;
    disposeOnNavigation?: boolean;
    disposeOnRouteNavigation?: boolean;
}

interface NgDocOverlayConfig extends OverlayConfig, NgDocOverlayProperties {
    readonly overlayContainer: Constructor<NgDocOverlayContainer>;
    readonly viewContainerRef?: ViewContainerRef;
    readonly disableClose?: boolean;
    readonly openAnimation?: ElementAnimation;
    readonly closeAnimation?: ElementAnimation;
}

export type { NgDocContextWithImplicit, NgDocOverlayConfig, NgDocOverlayContainer, NgDocOverlayProperties, NgDocUiConfig };
