import * as _angular_core from '@angular/core';
import { ComponentRef, Injector, ApplicationRef, EnvironmentInjector, Type, ViewContainerRef, ElementRef } from '@angular/core';
import { Observable } from 'rxjs';

declare enum CloseState {
    EXITED = "EXITED",
    BACKDROP_DISMISS = "BACKDROP_DISMISS",
    CLOSE_BUTTON = "CLOSE_BUTTON",
    ESCAPE = "ESCAPE",
    SUBMITTED = "SUBMITTED",
    CANCELLED = "CANCELLED"
}
interface CloseResult<T = any> {
    state: CloseState;
    data?: T;
}

interface ModalConfig {
    showBackdrop?: boolean;
    dismissOnBackdropClick?: boolean;
    showCloseButton?: boolean;
    escapeKeyClose?: boolean;
    backdropClass?: string;
    modalClass?: string;
}

declare class ModalRef<T = any> {
    componentInstance: any;
    readonly id: number;
    private _afterClosed;
    private _beforeClosed;
    private _afterOpened;
    afterClosed$: Observable<CloseResult<T>>;
    beforeClosed$: Observable<void>;
    afterOpened$: Observable<void>;
    contentRef?: ComponentRef<any>;
    constructor(componentInstance: any, id: number);
    onSubmitted(): Observable<CloseResult<T>>;
    onEscaped(): Observable<CloseResult<T>>;
    onBackdropDismiss(): Observable<CloseResult<T>>;
    onStateClose(state: CloseState): Observable<CloseResult<T>>;
    onCancelled(): Observable<CloseResult<T>>;
    onUserDismissed(): Observable<CloseResult<T>>;
    close(result?: any, state?: CloseState): void;
    notifyAfterOpened(): void;
    private getStateObservable;
}

declare class ModalService {
    private injector;
    private appRef;
    private environmentInjector;
    private modalStack;
    private contentComponentRegistry;
    constructor(injector: Injector, appRef: ApplicationRef, environmentInjector: EnvironmentInjector);
    open<T>(component: Type<T>, data?: Partial<T>, config?: ModalConfig): ModalRef<T>;
    private generateModalId;
    getModalRef(contentComponent: unknown): ModalRef | undefined;
    private cleanupModal;
    getTopModal(): ModalRef | undefined;
    isTopModal(modalRef: ModalRef): boolean;
    private closeSource;
    onClose$(): Observable<CloseResult>;
    onStateClose$(state: CloseState): Observable<CloseResult>;
    onSubmitted$(): Observable<CloseResult>;
    onDismissed$(): Observable<CloseResult>;
    onEscaped$(): Observable<CloseResult>;
    notifyClose(result: CloseResult): void;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalService, never>;
    static ɵprov: _angular_core.ɵɵInjectableDeclaration<ModalService>;
}

declare class ModalContainerComponent {
    modalContent: ViewContainerRef;
    modal: ElementRef;
    modalRef: ModalRef;
    contentComponent: ComponentRef<any>;
    modalService: ModalService;
    showBackdrop: _angular_core.InputSignal<boolean>;
    dismissOnBackdropClick: _angular_core.InputSignal<boolean>;
    showCloseButton: _angular_core.InputSignal<boolean>;
    escapeKeyClose: _angular_core.InputSignal<boolean>;
    modalClass: _angular_core.InputSignal<string>;
    backdropClass: _angular_core.InputSignal<string>;
    zIndex: _angular_core.InputSignal<number>;
    focus(): void;
    handleEscape(event: KeyboardEvent): void;
    createComponent<T>(component: Type<T>): ComponentRef<any>;
    onBackdropClick(event: MouseEvent): void;
    closeWithButton(): void;
    close(state: CloseState): void;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalContainerComponent, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalContainerComponent, "app-modal-container", never, { "showBackdrop": { "alias": "showBackdrop"; "required": true; "isSignal": true; }; "dismissOnBackdropClick": { "alias": "dismissOnBackdropClick"; "required": true; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": true; "isSignal": true; }; "escapeKeyClose": { "alias": "escapeKeyClose"; "required": true; "isSignal": true; }; "modalClass": { "alias": "modalClass"; "required": true; "isSignal": true; }; "backdropClass": { "alias": "backdropClass"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
}

export { CloseState, ModalContainerComponent, ModalRef, ModalService };
export type { CloseResult, ModalConfig };
