import * as i0 from '@angular/core';
import { DebugElement, EventEmitter, Predicate } from '@angular/core';
import { ComponentFixture } from '@angular/core/testing';
import { RiskCSVDownloadMenuComponent } from '@dbg-riskit/angular-file';
import { Observable } from 'rxjs';
import { RiskDataTableComponent, OrderingCriteria, Row, RiskHighlighterDirective } from '@dbg-riskit/angular-datatable';
import { ValueGetter, AuthProvider, UserInfo, ErrorMessage } from '@dbg-riskit/common';
import { RiskLayoutComponent } from '@dbg-riskit/angular-view';
export { RiskLayoutComponent } from '@dbg-riskit/angular-view';
import { RouterLink, RouterStateSnapshot, Event, RouterState, NavigationExtras, UrlTree } from '@angular/router';
import { RiskLoginMenuComponent, RiskLoginComponent } from '@dbg-riskit/angular-login';
import { AuthFlow, WellKnown } from '@dbg-riskit/angular-auth';
import { Request, RequestWithData } from '@dbg-riskit/angular-common';

declare const COMPILE_TIMEOUT_INTERVAL: number;
declare function initTestEnvironment(): void;

declare class RiskMessageComponentDef {
    debugElement: DebugElement;
    constructor(debugElement: DebugElement);
    get text(): string;
}

declare class Page<T> {
    protected fixture: ComponentFixture<T>;
    debugElement: DebugElement;
    component: T;
    private _timeOffset;
    constructor(fixture: ComponentFixture<T>);
    detectChanges(millis?: number): void;
    advanceAndDetectChanges(millis?: number): void;
    advanceHTTP(): void;
    advanceAndDetectChangesUsingOffset(millis: number): void;
    resetTimeOffset(): void;
    destroy(): void;
    setInput(inputName: string, value: unknown): void;
}
declare class PageWithLoading<T> extends Page<T> {
    constructor(fixture: ComponentFixture<T>);
    get initialLoadComponent(): RiskMessageComponentDef | null;
    get noDataComponent(): RiskMessageComponentDef | null;
}

import Spy = jasmine.Spy;

declare class RiskCSVDownloadMenuPage extends Page<RiskCSVDownloadMenuComponent> {
    constructor(fixture: ComponentFixture<RiskCSVDownloadMenuComponent>);
    get downloadWindowsLink(): DownloadLink;
    get downloadUnixLink(): DownloadLink;
}
declare class DownloadLink {
    element: DebugElement;
    private page;
    private _saveBlobSpy?;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
    });
    private _blobSpy?;
    get blobSpy(): Spy;
    get saveSpy(): Spy;
    click(): void;
    private setupBlobConstructorSpy;
    private setupSaveBlobSpy;
}
declare class DownloadTestComponent {
    data: any | Observable<any>;
    contentType?: string;
    filename?: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<DownloadTestComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<DownloadTestComponent, "ng-component", never, {}, {}, never, never, true, never>;
}
declare class DownloadTestComponentPage extends Page<DownloadTestComponent> {
    constructor(fixture: ComponentFixture<DownloadTestComponent>);
    get downloadLink(): DownloadLink;
}

declare class RiskDataTableDefinition {
    debugElement: DebugElement;
    private page;
    constructor(debugElement: DebugElement, page: {
        detectChanges: () => void;
        advanceAndDetectChanges: () => void;
    });
    get component(): RiskDataTableComponent<unknown, unknown>;
    get data(): any[];
    get element(): DebugElement;
    get header(): TableHeader;
    get sorting(): TableSorting;
    get body(): TableBody;
    get footer(): TableFooter;
    get recordsCount(): RecordsCount;
    get pager(): Pager;
}
declare class TableHeader {
    element: DebugElement;
    private page;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
    });
    get rows(): TableHeaderRow[];
    get cells(): TableHeaderCell[];
}
declare class TableHeaderRow {
    element: DebugElement;
    private page;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
    });
    get cells(): TableHeaderCell[];
}
declare class TableHeaderCell {
    element: DebugElement;
    private page;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
    });
    get sortingHandle(): SortingHandle | null;
    get tooltip(): string | null;
    get title(): string;
    get colspan(): number;
    get rowspan(): number;
}
declare class TableSorting {
    private table;
    private page;
    constructor(table: RiskDataTableDefinition, page: {
        detectChanges: () => void;
    });
    get handles(): SortingHandle[];
    get detailRowHandles(): SortingHandle[] | null;
    get currentOrdering(): Array<OrderingCriteria<any>>;
    checkSorting(firstNRows?: number, criterium?: OrderingCriteria<any>): void;
}
declare class SortingHandle {
    private page;
    private handle;
    constructor(page: {
        detectChanges: () => void;
    }, handle: DebugElement);
    click(): void;
}
declare class TableBody {
    element: DebugElement;
    private page;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
    });
    get rows(): TableBodyRow[];
    get cells(): TableBodyCell[];
}
declare class TableBodyRow {
    element: DebugElement;
    private page;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
    });
    get expander(): RowExpander;
    get cells(): TableBodyCell[];
    get rowDetail(): TableBodyDetail | null;
    get highlighted(): boolean;
    expandRow(): void;
}
declare class RowExpander {
    element: DebugElement;
    constructor(element: DebugElement);
    get icon(): string;
    get opened(): boolean;
    get closed(): boolean;
}
declare class TableBodyCell {
    element: DebugElement;
    constructor(element: DebugElement);
    get colspan(): number;
    get rowspan(): number;
}
declare class TableBodyDetail {
    element: DebugElement;
    private page;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
    });
    get body(): TableBodyDetailBody;
    get highlighted(): boolean;
    get colspan(): number;
    header(): TableHeader;
}
declare class TableBodyDetailBody {
    element: DebugElement;
    constructor(element: DebugElement);
    get rows(): TableBodyDetailRow[];
    get cells(): TableBodyCell[];
}
declare class TableBodyDetailRow {
    element: DebugElement;
    constructor(element: DebugElement);
    get cells(): TableBodyCell[];
}
declare class TableFooter {
    element: DebugElement;
    constructor(element: DebugElement);
    get rows(): TableFooterRow[];
    get cells(): TableBodyCell[];
}
declare class TableFooterRow {
    element: DebugElement;
    constructor(element: DebugElement);
    get cells(): TableBodyCell[];
}
declare class RecordsCount {
    element: DebugElement;
    constructor(element: DebugElement);
    get message(): string;
}
declare class Pager {
    element: DebugElement;
    private page;
    constructor(element: DebugElement, page: {
        detectChanges: () => void;
        advanceAndDetectChanges: () => void;
    });
    get pageButtons(): DebugElement[];
    expectLeadingButtonsDisabled(): void;
    expectLeadingButtonsNotDisabled(): void;
    expectTrailingButtonsDisabled(): void;
    expectTrailingButtonsNotDisabled(): void;
    expectButtonNumbers(numbers: number[]): void;
    expectButtonActive(index: number): void;
    click(index: number): void;
}
declare function chceckSorting(page: {
    detectChanges: () => void;
    dataTable: RiskDataTableDefinition;
}, criteria: Array<ValueGetter<any>>): void;
declare class DataTableDefinitionHosted extends Page<TestDataTableHostComponent> {
    constructor(fixture: ComponentFixture<TestDataTableHostComponent>);
    get dataTable(): RiskDataTableDefinition;
    setData(data: any): void;
    setPageSize(size: number): void;
}
declare class TestDataTableHostComponent {
    private static readonly defaultData;
    readonly data: i0.InputSignal<any[]>;
    readonly pageSize: i0.InputSignal<number>;
    readonly footer: i0.WritableSignal<any>;
    readonly defaultOrdering: (((record: any) => any) | {
        get: (record: any) => any;
        descending: boolean;
    })[];
    readonly valueGetter: (record: any) => any;
    static ɵfac: i0.ɵɵFactoryDeclaration<TestDataTableHostComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TestDataTableHostComponent, "ng-component", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
}

declare class RiskHighLighterDirectiveTestComponent {
    context?: {
        row: any;
        storage?: any;
        index: number;
        enabled: boolean;
    };
    trackBy(index: number, row: Row<any>): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<RiskHighLighterDirectiveTestComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RiskHighLighterDirectiveTestComponent, "ng-component", never, {}, {}, never, never, true, never>;
}
declare class HighLighterDirectivePage extends Page<RiskHighLighterDirectiveTestComponent> {
    constructor(fixture: ComponentFixture<RiskHighLighterDirectiveTestComponent>);
    get highlightedElement(): DebugElement;
    get classList(): DOMTokenList;
    get highlighter(): RiskHighlighterDirective<unknown>;
}

declare class RiskLayoutComponentDefinition {
    debugElement: DebugElement;
    private page;
    constructor(debugElement: DebugElement, page: {
        advanceAndDetectChanges: (milis?: number) => void;
    });
    get component(): RiskLayoutComponent;
    get headToolbar(): DebugElement;
    get logo(): DebugElement;
    get menu(): DebugElement[];
    get sideNavContainer(): DebugElement;
    get sideNav(): DebugElement;
    get sideNavMenu(): DebugElement[];
    get content(): DebugElement;
    openSideNav(): void;
    closeSideNav(): void;
}
declare class RiskLayoutTestComponentHostPage extends Page<RiskLayoutTestHostComponent> {
    get layoutComponent(): RiskLayoutComponentDefinition;
}
declare class RiskLayoutTestHostComponent {
    static ɵfac: i0.ɵɵFactoryDeclaration<RiskLayoutTestHostComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RiskLayoutTestHostComponent, "ng-component", never, {}, {}, never, never, true, never>;
}

declare class LinkDefinition {
    private page;
    link: DebugElement;
    constructor(page: Page<any>, link: DebugElement);
    get stub(): RouterLink;
    get text(): string;
    click(): void;
}

declare class LinkOnlyPage<T> extends Page<T> {
    constructor(fixture: ComponentFixture<T>);
    get link(): LinkDefinition;
}

declare class LoginMenuPage extends Page<RiskLoginMenuComponent> {
    get menuTrigger(): DebugElement;
    clickMenuTrigger(): void;
    waitForMenu(): void;
    get loginLink(): LinkDefinition;
    get logoutLink(): LinkDefinition;
}

declare class RiskLoginPage extends Page<RiskLoginComponent> {
    constructor(fixture: ComponentFixture<RiskLoginComponent>);
    get formElement(): DebugElement;
    get usernameElement(): DebugElement;
    set username(username: string);
    get passwordElement(): DebugElement;
    set password(password: string);
    get loginButtonElement(): DebugElement;
    get successMessage(): RiskMessageComponentDef | null;
    get errorMessage(): RiskMessageComponentDef | null;
    clickLogin(): void;
}

declare class TestMessageHostComponent {
    message: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<TestMessageHostComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<TestMessageHostComponent, "ng-component", never, {}, {}, never, never, true, never>;
}
declare class MessageHostedPage extends Page<TestMessageHostComponent> {
    constructor(fixture: ComponentFixture<TestMessageHostComponent>);
    get error(): RiskMessageComponentDef;
    get good(): RiskMessageComponentDef;
    get info(): RiskMessageComponentDef;
    get message(): RiskMessageComponentDef;
    get warn(): RiskMessageComponentDef;
    get initialLoad(): RiskMessageComponentDef;
    get noData(): RiskMessageComponentDef;
    get updateFailed(): RiskMessageComponentDef;
}

declare const storage: {
    authRequestedPath: string | null;
};
declare class AuthRoutingFlowServiceStub {
    private authServiceStub;
    private readonly authConfig;
    constructor();
    get authFlow(): AuthFlow;
    get authorizationCodeFlow(): boolean;
    get implicitFlow(): boolean;
    get hybridFlow(): boolean;
    get directFlow(): boolean;
    logout(): Observable<boolean>;
    login(username?: string, password?: string): Observable<boolean>;
    loginViaService(): Observable<boolean>;
    storeRequestedPath(state?: RouterStateSnapshot): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AuthRoutingFlowServiceStub, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AuthRoutingFlowServiceStub>;
}

declare class AuthServiceStub implements AuthProvider {
    private user?;
    private readonly _loggedInStream;
    get loggedIn(): Observable<boolean>;
    get userProfile(): Observable<UserInfo | undefined>;
    get loggedInStream(): Observable<boolean>;
    loginViaAuthService(): Observable<boolean>;
    checkLocationForLoginData(): Observable<boolean>;
    directLogin(username: string, password: string): Observable<boolean>;
    logout(): Observable<never>;
    emitLoginStatusChange(status: boolean): void;
    refreshToken(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AuthServiceStub, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AuthServiceStub>;
}

declare const WELL_KNOWN: WellKnown;
declare class WellKnownServiceStub {
    get wellKnown(): Observable<WellKnown>;
    static ɵfac: i0.ɵɵFactoryDeclaration<WellKnownServiceStub, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<WellKnownServiceStub>;
}

declare const FAKE_HTTP_ASYNC_TIMEOUT = 1000;
declare class HttpServiceStub<T> {
    private value;
    private error;
    unauthorized: EventEmitter<ErrorMessage>;
    returnValue(value: T): void;
    popReturnValue(): T | undefined;
    shiftReturnValue(): T | undefined;
    throwError(value: ErrorMessage): void;
    get(request: Request<T>): Observable<T | undefined>;
    post(request: RequestWithData<T>): Observable<T | undefined>;
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpServiceStub<any>, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HttpServiceStub<any>>;
}
declare class HttpAsyncServiceStub<T> extends HttpServiceStub<T> {
    get(request: Request<T>, auth?: boolean): Observable<T | undefined>;
    post(request: RequestWithData<T>): Observable<T | undefined>;
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpAsyncServiceStub<any>, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HttpAsyncServiceStub<any>>;
}

/**
 * A lightweight Router stub for testing that doesn't require actual routing infrastructure.
 * Use this when you want complete isolation from the Router and only need to verify navigation calls.
 */
declare class RouterStub {
    private _url;
    private _events$;
    get url(): string;
    get events(): Observable<Event | null>;
    get routerState(): RouterState;
    navigate(commands: unknown[], _extras?: NavigationExtras): Promise<boolean>;
    navigateByUrl(url: string | UrlTree, _extras?: NavigationExtras): Promise<boolean>;
    createUrlTree(_commands: unknown[], _navigationExtras?: NavigationExtras): UrlTree;
    serializeUrl(_url: UrlTree): string;
    parseUrl(_url: string): UrlTree;
    isActive(_url: string | UrlTree, _exact: boolean): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<RouterStub, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<RouterStub>;
}

declare class RiskLoginMenuStubComponent {
    readonly orientation: i0.InputSignal<"row" | "column">;
    static ɵfac: i0.ɵɵFactoryDeclaration<RiskLoginMenuStubComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<RiskLoginMenuStubComponent, "risk-login-menu", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
}

declare class ByUtil {
    static and<T>(...predicates: Array<Predicate<T>>): Predicate<T>;
    static or<T>(...predicates: Array<Predicate<T>>): Predicate<T>;
    static not<T>(predicate: Predicate<T>): Predicate<T>;
}

/** Button events to pass to `DebugElement.triggerEventHandler` for RouterLink event handler */
declare const BUTTON_CLICK_EVENTS: {
    left: {
        button: number;
    };
    right: {
        button: number;
    };
};
/** Simulate element click. Defaults to mouse left-button click event. */
declare function click(el: DebugElement | HTMLElement, eventObj?: any): void;
declare function setNgModelValue(element: DebugElement, value: string, realAsync?: boolean): void;
declare function setNgModelSelectValue(element: DebugElement, selectedIndex: number, realAsync?: boolean): void;
declare function dispatchEvent(element: DebugElement | HTMLElement | Window, eventName: string): void;
/**
 * Create custom DOM event the old fashioned way
 *
 * https://developer.mozilla.org/en-US/docs/Web/API/Event/initEvent
 * Although officially deprecated, some browsers (phantom) don't accept the preferred "new Event(eventName)"
 */
declare function newEvent(eventName: string, bubbles?: boolean, cancelable?: boolean): CustomEvent;

declare function compileTestBed(compileFunction: () => Promise<any>, destroyFunction?: () => void, stubMatchMedia?: boolean): void;

export { AuthRoutingFlowServiceStub, AuthServiceStub, BUTTON_CLICK_EVENTS, ByUtil, COMPILE_TIMEOUT_INTERVAL, DataTableDefinitionHosted, DownloadLink, DownloadTestComponent, DownloadTestComponentPage, FAKE_HTTP_ASYNC_TIMEOUT, HighLighterDirectivePage, HttpAsyncServiceStub, HttpServiceStub, LinkDefinition, LinkOnlyPage, LoginMenuPage, MessageHostedPage, Page, PageWithLoading, Pager, RecordsCount, RiskCSVDownloadMenuPage, RiskDataTableDefinition, RiskHighLighterDirectiveTestComponent, RiskLayoutComponentDefinition, RiskLayoutTestComponentHostPage, RiskLayoutTestHostComponent, RiskLoginMenuStubComponent, RiskLoginPage, RiskMessageComponentDef, RouterStub, RowExpander, SortingHandle, TableBody, TableBodyCell, TableBodyDetail, TableBodyDetailBody, TableBodyDetailRow, TableBodyRow, TableFooter, TableFooterRow, TableHeader, TableHeaderCell, TableHeaderRow, TableSorting, TestDataTableHostComponent, TestMessageHostComponent, WELL_KNOWN, WellKnownServiceStub, chceckSorting, click, compileTestBed, dispatchEvent, initTestEnvironment, newEvent, setNgModelSelectValue, setNgModelValue, storage };
